当前位置:   article > 正文

3.使用STM32CubeMX实现USART_usart_hardwareflow

usart_hardwareflow
dwwdwdfefefbvr( 2 USART1 的设置
USART1 接口的模式设置
1 Mode :工作模式,设置为 Asynchronous (异步)
2 Hardware Flow Control(RS232) :硬件流控制。开发板 的USART 接口并没有使用硬件流信号,所以设置为 Disable。
USART1 接口的参数置
1 Baud Rate :波特率,设置为 57600 bps
2 Word Length :字长(包括奇偶校验位),可选 8 位或 9 位,设置为8
3 Parity :奇偶校验位。 可选None (无)、 Even (偶 校验)、Odd (奇校验)。这里设置为None 。如果设置有奇 偶校验,字长应该设置为9
4 Stop Bits :停止位个 数。可选1 2 ,这里设置为 1 STM32处理器扩展的2个参数
1 Data Direction :数据 方向,这里设置为Receive and Transmit,也就是收发 双向
2 Over Sampling :过采样,可选16 8 采样点, 这里设置为16
打开 USART1 的全局中断
由于 RTC 唤醒中断和串口中断的程序中都可能用到延时函 数HAL_Delay() ,所以设置这两个中断的抢占优先级为 1 ,即要 低于System tick timer 的抢占优先级。
中断事件宏定义 , 中断事件描述,                  回调函数:
UART_IT_CTS     CTS 信号变化中断                   无
UART_IT_LBD      LIN 打断检测中断                    无
UART_IT_TXE     发送数据寄存器非空中断          无
UART_IT_TC        传输完成中断,用于发送完成  HAL_UART_TxCpltCallback(huart)
UART_IT_RXNE   接收数据寄存器非空中断         HAL_UART_RxCpltCallback(huart)
UART_IT_IDLE     线路空闲状态中断                     无
UART_IT_PE       奇偶校验中断                           HAL_UART_ErrorCallback(huart)
UART_IT_ERR    发生帧错误、噪声错误、溢出错误 的中断  HAL_UART_ErrorCallback(huart)
  1. 1. 常用宏函数
  2. __HAL_UART_ENABLE(__HANDLE__),使能一个UART口,如__HAL_UART_ENABLE(&huart1);
  3. __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__),使能某个中断事件源,如
  4. __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); //使能接收中断
  5. __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能空闲中断
  6. __HAL_UART_DISABLE_IT(__HANDLE__, __INTERRUPT__),禁止某个中断事件源
  7. __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__),检查一个串口的某个中断标志是否被置位,返回值为宏定义常量SET或RESET。
  8. 中断事件标志的宏定义如下:
  9. UART_FLAG_CTS: CTS 信号变化标志
  10. UART_FLAG_LBD: LIN 打断检测标志
  11. UART_FLAG_TXE: 发送数据寄存器空标志
  12. UART_FLAG_TC: 发送完成标志
  13. UART_FLAG_RXNE: 接收数据寄存器非空标志
  14. UART_FLAG_IDLE: 线路空闲标志
  15. UART_FLAG_ORE: 出错误标志
  16. UART_FLAG_NE: 声错误标志
  17. UART_FLAG_FE: 帧错误标志
  18. UART_FLAG_PE: 奇偶校验错误标志
  19. __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__),清除一个UART口的某个事件标志位
  20. 2. 数据传输模式
  21. 串口数据传输有两种模式:
  22. 阻塞模式(Blocking mode)就是轮询模式,
  23. 例如使用函数HAL_UART_Transmit()发送一个缓冲区的数据时,这个函数会一直执行直到数据传输完成之后函数才返回。
  24. 非阻塞模式(Non-blocking mode)是使用中断或DMA模式进行数据传输,例如使用函数HAL_UART_Transmit_IT()启动一个缓冲区的数据传输后,该函数立刻返回。数据传输的过程引发各种中断,用户在相应的回调函数里去处理。
  25. 3. 阻塞式数据传输函数
  26. 函数HAL_UART_Transmit()和HAL_UART_Receive()用于阻塞模式数据发送和接收。以阻塞模式发送一个缓冲区的数据,若返回值为HAL_OK表示传输成功。
  27. 参数pData是缓冲区指针;参数Size是需要传输的字节数;参数Timeout是超时限制节拍数,表示超过这个时间时函数无条件返回。例如:
  28. HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart,
  29. uint8_t *pData, uint16_t Size, uint32_t Timeout)
  30. uint8_t timeStr[]="15:32:06\n";
  31. HAL_UART_Transmit(&huart1,timeStr,sizeof(timeStr),200);
  32. 以阻塞模式接收指定长度的数据道缓冲区,若返回值为HAL_OK表示接收成功。参数pData是用于存放接收数据的缓冲区的指针;参数Size是需要接收的字节数;参数Timeout是超时限制节拍数。例如:
  33. HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart,
  34. uint8_t *pData, uint16_t Size, uint32_t Timeout)
  35. uint8_t recvStr[10];
  36. HAL_UART_Receive(&huart1, recvStr,10 ,200);
  37. 4. 非阻塞式数据传输函数
  38. 用中断或DMA方式进行非阻塞模式的数据传输以中断方式发送一定长度的数据,若返回值为HAL_OK表示启动成功,但并不表示数据发送完成了。参数pData是需要发送数据缓冲区的指针,参数Size是需要发送的字节数。例如:
  39. HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData,uint16_t Size)
  40. uint8_t timeStr[]="15:32:06\n";
  41. HAL_UART_Transmit_IT(&huart1,timeStr,sizeof(timeStr));
  42. 发送结束后会调用回调函数HAL_UART_TxCpltCallback()以中断方式接收一定长度的数据,若返回值HAL_OK表示启动成功,但并不表示已经接收完数据了。参数pData是存放接收数据的缓冲区的指针,参数Size是需要接收的字节数。例如:
  43. HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart,
  44. uint8_t *pData, uint16_t Size)
  45. uint8_t rxBuffer[10]; //接收数据缓冲区
  46. HAL_UART_Receive_IT(huart, rxBuffer,10);
  47. 接收完成后会调用回调函数HAL_UART_RxCpltCallback()
  48. 函数HAL_UART_Receive_IT()有一些特性需要注意:
  49. 1)这个函数执行一次只能接收固定长度的数据,即使设置为接收一个字节的数据。
  50. 2)在完成数据接收后会自动关闭接收中断,不会再继续接收下一批数据。
  51. 若要再接收下一批数据,需要再执行一次这个函数,且不能在回调函数HAL_UART_RxCpltCallback()里调用这个函数。
  52. 可以在USART1_IRQHandler()函数最后加上HAL_UART_Receive_IT()注意使用extern定义全局变量。另一博客有写。
  1. int main(void)
  2. {
  3. /* USER CODE BEGIN 2 */
  4. TFTLCD_Init(); //LCD软件初始化
  5. LCD_ShowString(10,10, (uint8_t *)"Demo12_1:USART1+RTC");
  6. sprintf(rxBuffer,(char *)"Hello word!!!Hello \r");
  7. HAL_UART_Transmit (&huart1,(uint8_t *)rxBuffer,sizeof(rxBuffer),5000);
  8. HAL_Delay(10);
  9. sprintf(rxBuffer,"Hello No Blocking \n");
  10. HAL_UART_Transmit_IT (&huart1,(uint8_t *)rxBuffer,sizeof(rxBuffer));
  11. HAL_Delay(10);
  12. HAL_UART_Receive_IT(&huart1,(uint8_t *)rxBuffer,5); //中断方式接收5个字节
  13. while(1);
  14. }
  15. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //串口接收完成回调函数
  16. {
  17. if (huart->Instance == USART1)
  18. {
  19. LCD_ShowString(10,10, (uint8_t *)"Demo12_1:USART1+RTC");
  20. } }

步骤:在USART中选择Mode为Asynchronous,选择波特率,要用中断方式发送就打开中断,剩下的就是以上的程序,阻塞发送或者中断方式,中断方式要重写回调函数。

接收不定长度的字符串:

  1. 1.main.h:
  2. extern uint8_t Str_Tra[20];//全局变量声明
  3. extern uint8_t Str_Rec[20];
  4. extern uint8_t Char_Rec;
  5. 2.main.c:
  6. uint8_t Str_Tra[20]="hello,taoj123456789\n";//全局变量定义
  7. uint8_t Str_Rec[20]="hello,taoj123765489\n";
  8. uint8_t Char_Rec;
  9. HAL_UART_Receive_IT (&huart1,&Char_Rec,1);
  10. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  11. {
  12. static int i=0;
  13. if(Char_Rec!='\n')
  14. {
  15. Str_Rec[i++]=Char_Rec;
  16. }
  17. else{
  18. HAL_UART_Transmit_IT(&huart1,Str_Rec,i);
  19. i=0;
  20. }
  21. }
  22. 3.f1xx.it.c内加入
  23. HAL_UART_Receive_IT (&huart1,&Char_Rec,1);//继续打开接收中断开关。
  24. void USART1_IRQHandler(void)
  25. {
  26. /* USER CODE BEGIN USART1_IRQn 0 */
  27. /* USER CODE END USART1_IRQn 0 */
  28. HAL_UART_IRQHandler(&huart1);
  29. /* USER CODE BEGIN USART1_IRQn 1 */
  30. __HAL_UART_CLEAR_FLAG(&huart3,UART_FLAG_RXNE);清除标志位
  31. HAL_UART_Receive_IT (&huart1,&Char_Rec,1);
  32. /* USER CODE END USART1_IRQn 1 */
  33. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/219920
推荐阅读
相关标签
  

闽ICP备14008679号