本帖最后由 e芯凌 于 2019-11-11 21:30 编辑
串口操作相关库函数(省略入口参数):- void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
- void USART_Cmd();//使能串口
- void USART_ITConfig();//使能相关中断
- void USART_SendData();//发送数据到串口,DR
- uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
- FlagStatus USART_GetFlagStatus();//获取状态标志位
- void USART_ClearFlag();//清除状态标志位
- ITStatus USART_GetITStatus();//获取中断状态标志位
- void USART_ClearITPendingBit();//清除中断状态标志位
复制代码
波特率计算方法
串口配置的一般步骤
1. 串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd(); 2. 串口复位:USART_DeInit(); 这一步不是必须的 3. GPIO端口模式设置:GPIO_Init();模式设置为GPIO_Mode_AF_PP 4. 串口参数初始化:USART_Init(); 5. 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤) NVIC_Init(); USART_ITConfig(); 6. 使能串口:USART_Cmd(); 7. 编写中断处理函数:USARTx_IRQHandler(); 8. 串口数据收发: 9. void USART_SendData();//发送数据到串口,DR 10. uint16_tUSART_ReceiveData();//接受数据,从DR读取接受到的数据 11. 串口传输状态获取: FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx,uint16_t USART_FLAG); void USART_ClearITPendingBit(USART_TypeDef* USARTx,uint16_t USART_IT);
样码示例:
- #include "stm32f10x.h"
- void my_usart_init(void)
- {
-
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//①
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
-
- //②
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//LED0-->PA.9 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz; //IO口速度为10MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.9
-
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//LED0-->PA.10 端口配置
- GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING; //推挽输出
- GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz; //IO口速度为10MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.10
-
-
- USART_InitStructure.USART_BaudRate=115200;
- USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
- USART_InitStructure.USART_Parity=USART_Parity_No;
- USART_InitStructure.USART_StopBits=USART_StopBits_1;
- USART_InitStructure.USART_WordLength=USART_WordLength_8b;
- USART_Init(USART1,&USART_InitStructure);//③
- USART_Cmd(USART1,ENABLE);//使能串口一
- USART_ITConfig(USART1,USART_IT_RXNE ,ENABLE);//开启接收中断
- NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
- NVIC_Init(&NVIC_InitStructure);
- }
- void USART1_IRQHandler(void)
- {
- u8 res;
- if(USART_GetITStatus(USART1,USART_IT_RXNE))
- {
- res= USART_ReceiveData(USART1);
- USART_SendData(USART1,res);
- }
- }
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- my_usart_init();
- while(1);
- }
复制代码
Printf支持:
- //加入以下代码,支持printf函数,而不需要选择use MicroLIB
- #if 1
- #pragma import(__use_no_semihosting)
- //标准库需要的支持函数
- struct __FILE
- { int handle;
- };
- FILE __stdout;
- //定义_sys_exit()以避免使用半主机模式
- _sys_exit(int x)
- { x = x; }
- //重定义fputc函数
- int fputc(int ch, FILE *f)
- {
- while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
- USART1->DR = (u8) ch;
- return ch;
- }
- #endif
复制代码
- #define USART_REC_LEN 200 //定义最大接收字节数 200
- u8 USART_RX_BUF[USART_REC_LEN];
- //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
-
- u16 USART_RX_STA; //接收状态标记
复制代码
|