加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

STM32之USART

发布时间:2020-12-15 06:39:24 所属栏目:百科 来源:网络整理
导读:?最近这几天一直在忙在STM32的USART实验,虽然网上有很多的实例,自己也曾完全按照书的例程一个字不少的输入电脑中,但在实际编程中总是出现太多的错误。最终利用仿真发现最终的错误,仅仅是多了一个函数,为了这一个函数,我调试了整整两天。呵呵,最终还是

?最近这几天一直在忙在STM32的USART实验,虽然网上有很多的实例,自己也曾完全按照书的例程一个字不少的输入电脑中,但在实际编程中总是出现太多的错误。最终利用仿真发现最终的错误,仅仅是多了一个函数,为了这一个函数,我调试了整整两天。呵呵,最终还是做出来啦

以下是试验程序:
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"
unsigned int i = 0,j = 0;
//定义中断标志变量
FlagStatus? RX_status ;
/*创建一个数组*/
unsigned char TxBuf1[] = "zheng zhou da xuern";
unsigned char TxBuf2[] = "rn";
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void? Delay_Ms(u16 time);
void? RCC_Configuration(void);
void? GPIO_Configuration(void);
void? NVIC_Configuration(void);
void? USART_Configuration(void);
int main(void)
{
?#ifdef DEBUG
? ?debug();
?#endif
? ?/* System Clocks Configuration 使用外部RC晶振 */
? ?RCC_Configuration();?

?/* NVIC configuration */
? ?NVIC_Configuration();

?/* Configure the GPIOs */
? ?GPIO_Configuration();
?//四个灯都灭
?GPIO_Write(GPIOB,GPIO_Pin_8 | GPIO_Pin_9);
?GPIO_Write(GPIOE,GPIO_Pin_0 | GPIO_Pin_1);
?//LED1亮
?GPIO_ResetBits(GPIOB,GPIO_Pin_8);
?//LED2亮
?GPIO_ResetBits(GPIOB,GPIO_Pin_9);
?//LED3亮
?GPIO_ResetBits(GPIOE,GPIO_Pin_0);
?//LED4亮
?GPIO_ResetBits(GPIOE,GPIO_Pin_1);
?Delay_Ms(100);
?/* USART configuration */
?USART_Configuration();
?//清除标志位,否则第1位数据会丢失
?? ?USART_ClearFlag(USART1,USART_FLAG_TC);
?while(j < 10)
?{
??for(i = 0;TxBuf1[i] != '';i++)
??{?
???USART_SendData(USART1,TxBuf1[i]);
???//等待数据发送完毕,此句必不可少,否则不能正确接收到
?????? ?while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
??}

??j++;
?}

?while(1)
?{?
??if(USART_GetFlagStatus(USART1,USART_IT_RXNE) == SET)
??{
???i = USART_ReceiveData(USART1);???//从COM0读取数据
???USART_SendData(USART1,i);
???for(j = 0;TxBuf2[j] != '';j++)
???{
????USART_SendData(USART1,TxBuf2[j]);
???}
???GPIO_ResetBits(GPIOE,GPIO_Pin_0);
???Delay_Ms(100);
??}
??
??GPIO_SetBits(GPIOE,GPIO_Pin_0);
?}
}
/*******************************************************************************
* Function Name? : Delay_Ms
* Description??? : delay 1 ms.
* Input????????? : time (ms)
* Output???????? : None
* Return???????? : None
*******************************************************************************/
void Delay_Ms(u16 time)? //延时函数
{
?u16 i,j;
?for(i=0;i<time;i++)
? ??for(j=0;j<10260;j++)?
??? ??;
}
/*******************************************************************************
* Function Name? : RCC_Configuration
* Description??? : Configures the different system clocks.
* Input????????? : None
* Output???????? : None
* Return???????? : None
*******************************************************************************/
void RCC_Configuration(void)
{
?/*? 使用内部RC晶振 */
?/*******************************?
?RCC_HSICmd(ENABLE);//使能内部高速晶振 ;
??RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);//选择内部高速时钟作为系统时钟SYSCLOCK=8MHZ?
?RCC_HCLKConfig(RCC_SYSCLK_Div1);//选择HCLK时钟源为系统时钟SYYSCLOCK
? ?RCC_PCLK1Config(RCC_HCLK_Div4);//APB1时钟为2M
? ?RCC_PCLK2Config(RCC_HCLK_Div4);//APB2时钟为2M
? ?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能APB2外设GPIOB时钟
?*********************************/

/*? 使用外部RC晶振 */
?/* RCC system reset(for debug purpose) */
? ?RCC_DeInit();

? ?/* Enable HSE */
? ?RCC_HSEConfig(RCC_HSE_ON);

? ?/* Wait till HSE is ready */
? ?while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);

??? /* Enable Prefetch Buffer */
??? FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

??? /* Flash 2 wait state */
??? FLASH_SetLatency(FLASH_Latency_2);
?
??? /* HCLK = SYSCLK */
??? RCC_HCLKConfig(RCC_SYSCLK_Div1);
?
??? /* PCLK2 = HCLK */
??? RCC_PCLK2Config(RCC_HCLK_Div1);

??? /* PCLK1 = HCLK/2 */
??? RCC_PCLK1Config(RCC_HCLK_Div2);

??? /* PLLCLK = 8MHz * 9 = 72 MHz */
??? RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

??? /* Enable PLL */
??? RCC_PLLCmd(ENABLE);

??? /* Wait till PLL is ready */
??? while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

??? /* Select PLL as system clock source */
??? RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

??? /* Wait till PLL is used as system clock source */
??? while(RCC_GetSYSCLKSource() != 0x08);

?/* Enable GPIOB clocks */
?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);// 使能APB2外设GPIOB时钟
?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);// 使能APB2外设GPIOA时钟
?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 使能APB2外设GPIOC时钟
?//Enable USART1
?RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);// 使能APB2外设GPIOC时钟
}
/*******************************************************************************
* Function Name? : NVIC_Configuration
* Description??? : Configures the nested vectored interrupt controller.
* Input????????? : None
* Output???????? : None
* Return???????? : None
*******************************************************************************/
void NVIC_Configuration(void)
{??
?NVIC_InitTypeDef NVIC_InitStructure;

#ifdef? VECT_TAB_RAM?
? ?/* Set the Vector Table base location at 0x20000000 */
? ?NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
#else? /* VECT_TAB_FLASH? */
? ?/* Set the Vector Table base location at 0x08000000 */
? ?NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);??
#endif
?NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
?/* Enable the USART1 Interrupt */
? ?NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;? // USART1 全局中断 ;
? ?NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
? ?NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
? ?NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
? ?NVIC_Init(&NVIC_InitStructure);
}
/*******************************************************************************
* Function Name? : GPIO_Configuration
* Description??? : Configures the different GPIO ports.
* Input????????? : None
* Output???????? : None
* Return???????? : None
*******************************************************************************/
void GPIO_Configuration(void)
{
? ?GPIO_InitTypeDef GPIO_InitStructure;
???? /*???
??PB8端口? LED1
??PB9端口? LED2
??PE0端口? LED3
??PE1端口? LED4
?*/?
?GPIO_InitStructure.GPIO_Pin?= GPIO_Pin_0|GPIO_Pin_1;//选择PE0 PE1
? ?GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;?//管脚频率为50MHZ
? ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;?//模式为推挽输出
? ?GPIO_Init(GPIOE,&GPIO_InitStructure);?? //初始化GPIOB寄存器

?GPIO_InitStructure.GPIO_Pin?= GPIO_Pin_8|GPIO_Pin_9;//选择PB8 PB9
? ?GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//管脚频率为50MHZ
? ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置为推挽输出
? ?GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB寄存器
? ?/* Configure USART1 Tx (PA.09) as alternate function push-pull */
? ?GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
? ?GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
? ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
? ?GPIO_Init(GPIOA,&GPIO_InitStructure);

? ?/* Configure USART1 Rx (PA.10) as input floating */
? ?GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
? ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
? ?GPIO_Init(GPIOA,&GPIO_InitStructure);

}
void USART_Configuration(void)
{
/* USART1 configuration ------------------------------------------------------*/
? /* USART1 configured as follow:
??????? - BaudRate = 9600 baud?
??????? - Word Length = 8 Bits
??????? - Two Stop Bit
??????? - Odd parity
??????? - Hardware flow control disabled (RTS and CTS signals)
??????? - Receive and transmit enabled
??????? - USART Clock disabled
??????? - USART CPOL: Clock is active low
??????? - USART CPHA: Data is captured on the second edge
??????? - USART LastBit: The clock pulse of the last data bit is not output to
???????????????????????? the SCLK pin
*/? ?
?
?USART_InitTypeDef USART_InitStructure;
?USART_ClockInitTypeDef USART_ClockInitStructure;

? ?USART_InitStructure.USART_BaudRate = 115200; // 设置了USART传输的波特率 ;
? ?USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位数据 ;
? ?USART_InitStructure.USART_StopBits = USART_StopBits_1;?// 在帧结尾传输1个停止位 ;
? ?USART_InitStructure.USART_Parity = USART_Parity_No;? // 奇偶失能 ; ;
?USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;? // 接收发送使能 ;
? ?USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//USART_HardwareFlowControl_None;? // 硬件流控制失能? ;
? ?
? ?USART_Init(USART1,&USART_InitStructure); // 初始化外设USART1寄存器 ;


?USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;?// 时钟低电平活动 ;
? ?USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;? // 时钟低电平 ;
? ?USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;?// 时钟第二个边沿进行数据捕获 ;
??USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; // 最后一位数据的时钟脉冲不从SCLK输出 ;

? ?USART_ClockInit(USART1,&USART_ClockInitStructure); ??USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); // 使能指定的USART1接收中断 ; //? USART_ITConfig(USART1,USART_IT_TXE,ENABLE);? // 使能指定的USART1发送中断 ; ? ? ?USART_Cmd(USART1,ENABLE); // 使能USART1外设 ; ?? }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读