你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G0学习手册——使用HAL库进行USART串口通讯

[复制链接]
STMCU小助手 发布时间:2021-11-8 17:15
芯片基本外设配置
在SYS里面开启Serial Wire调试接口
在RCC里面使能HSE (Crystal/Ceramic Resonator)
配置时钟树
选中“HSE”、"PLLCLK",在HCLK(MHz)中输入64,回车,软件会自动配置数值。

20200502143029653.png


配置USART1外设
在connectivity选项卡中,选择"USART1",在mode中选择:Asynchronous(异步通讯)

在“Parameter Settings”中设置基本参数,参数可以自定义,但是通讯双方一定要相同

Baud Rate(波特率):115200,常用有4800,9600。

Word Length(数据位):8,可选7、8、9

Parity(校验位):None,可选None、Even、Odd

Stop Bits(停止位):1,常用有1、2、0.5、1.5

其他参数默认值。

20200502145229923.png


生成代码后,在MDK软件中打开,在debug中设置“Reset and Run”。

使用串口的三种方法(直接调用hal库、printf、中断方式)
第一种方法(直接调用HAL库)
在int main()主函数中写入如下代码

  1. uint8_t temp_buf[1]="c";                         //定义一个数组,这个数组长度可以自定义
  2. while (1)
  3.   {
  4.     /* USER CODE END WHILE */
  5.     /* USER CODE BEGIN 3 */
  6.     HAL_Delay(1000);
  7.     HAL_UART_Transmit(&huart1,temp_buf,1,10);    //使用usart1串口每一秒发送字符c
  8.   }
复制代码
  1. uint8_t temp_buf=109;                         //定义整数,
  2. while (1)
  3.   {
  4.     /* USER CODE END WHILE */
  5.     /* USER CODE BEGIN 3 */
  6.     HAL_Delay(1000);
  7.     HAL_UART_Transmit(&huart1,&temp_buf,1,10);    //使用usart1串口每一秒发送字符m
  8.   }
复制代码
  1. HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout<span style="background-color: rgb(255, 255, 255);">)</span>
复制代码

UART_HandleTypeDef *huart:指定串口,usart1就是&huart1。usart2就是改为&huart2。

uint8_t *pData:就是要发送的数据

uint16_t Size:单位为字节,至少要比发送数据长度要大。

uint32_t Timeout:超时时间

第二种方法(printf)
在main.c文件中添加头文件
  1. #include <stdio.h>
复制代码

main.c文件中加入重定向函数 ,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数
  1. /* USER CODE BEGIN 0 */
  2. #ifdef __GNUC__
  3.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  4.      set to 'Yes') calls __io_putchar() */
  5.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  6. #else
  7.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  8. #endif /* __GNUC__ */
  9. /**
  10.   * @brief  Retargets the C library printf function to the USART.
  11.   * @param  None
  12.   * @retval None
  13.   */
  14. PUTCHAR_PROTOTYPE
  15. {
  16.   /* Place your implementation of fputc here */
  17.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  18.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

  19.   return ch;
  20. }
  21. /* USER CODE END 0 */
复制代码

在int main主函数while循环中加入代码
  1. while (1)
  2.   {
  3.     /* USER CODE END WHILE */
  4.     /* USER CODE BEGIN 3 */
  5.                 HAL_Delay(1000);              //延时一秒钟输出字符b
  6.                 printf("b\r\n");               
  7.   }
  8.   /* USER CODE END 3 */
复制代码

第三种方法(使用中断)
在CubeMX中,设置USART1全局中断使能,然后重新生成代码。

20200502170333550.png


在main.c文件中定义变量
  1. uint8_t TX_Buff[]="THIS IS A MESSAGE!\r\n";        //发送缓存
  2. uint8_t RX_Buff[2];                                //接收缓存
复制代码

在int main主函数中,MX_USART1_UART_Init();后面写入串口输出函数
  1. HAL_UART_Transmit_IT(&huart1,TX_Buff,sizeof(TX_Buff));   //用于第一的串口输出信息
复制代码

在while(1)循环中,加入接收中断函数
  1. /*
  2. *2表示缓冲字节,发送的字节数要于缓冲的一致。如果发送长度小于2,则等到2字节后再显示出来
  3. */
  4. HAL_UART_Receive_IT(&huart1,RX_Buff,2);         
复制代码

再int main函数后面写上中断回调函数
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  2. {
  3.         UNUSED(huart);
  4.         HAL_UART_Transmit(&huart1,(uint8_t*)RX_Buff,2,100);        
  5. }
复制代码

编译,下载到开发板即可



20200502225239316.png
收藏 评论2 发布时间:2021-11-8 17:15

举报

2个回答
ghost110 回答时间:2021-11-8 17:36:29

每日学习小技巧,提升看得见

STMWoodData 回答时间:2021-11-9 09:09:31

谢谢分享,学习一下

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版