使用配置串口1配置引脚
我的板子上通过引脚引出了串口1,串口1连接到PA8和PA9。
配置串口通讯参数
使能串口1,并将其配置为异步模式,波特率为8N1。
使能串口中断
查看生成的代码
引脚和中断的初始化在.c中
通信中使用的参数,如波特率校验方式等,在main.c中初始化。
同样是串口初始化代码,为什么要单独写呢?
这可能是一种等级观念。 如果换板子,只需要修改引脚和中断的功能,用户功能不需要修改。 例如,用户关心的是波特率,而不是引脚。
按键控制串口发送代码编写
通过串口打印关键信息。
//main.c
int main(void)
{
u8 UART_BUF[12] = "you press A!";
u8 key;
while (1)
{
key = KEY_Scan(0);
switch(key)
{
case KEY_A_PRES: UART_BUF[10] = 'A'; break;
case KEY_B_PRES: UART_BUF[10] = 'B'; break;
case KEY_C_PRES: UART_BUF[10] = 'C'; break;
case KEY_D_PRES: UART_BUF[10] = 'D'; break;
default: break;
}
if(key)
{
LED1 = !LED1;
HAL_UART_Transmit(&huart1,UART_BUF,12,0xffff);
}
}
}
是HAL库提供的串口发送函数。 函数的描述信息可以在HAL库的手册中找到,或者通过跳转到代码中的函数来找到。
根据描述,这个发送函数是阻塞的。 参数为超时时间,代表某个执行函数占用串口的最长时间,单位为毫秒。 简单来说,在当前数据发送完毕之前,不能再发送其他数据。 因此,在调用该函数时,需要指定参数以及发送时间。 在此期间,由于串口资源被独占,发送函数无法成功调用。 如果在规定时间内发送完数据,则释放占用的串口资源; 如果时间到了,即使数据还没有发送完全(例如数据量很大),仍然需要将串口资源的控制权交还给其他人使用。
正确连接硬件并配置好串口助手后,可以看到如下关键信息,说明串口数据发送成功。
需要注意的是,HAL库提供的发送函数不止一种,还有中断模式和DMA模式。 这是使用此功能的最简单方法。
重映射功能
刚才的例子中,先将字符填充到数组中,然后通过数组发送数据,比较麻烦。 可以直接打印字符串吗? 可以通过C语言重映射函数来实现。
创建 UART.c 文件并将其添加到项目中。 输入以下代码:
#include "stdio.h"
#include "main.h"
#ifdef __GNUC_
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
//重映射printf的功能
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
请注意适当的外部声明。我在 main.h 中编写
;
然后就可以在main函数中调用了。
//main() while(1)
if(key)
{
LED1 = !LED1;
printf("return value is %d! \r\n",key);
HAL_UART_Transmit(&huart1,UART_BUF,12,0xffff); //发送接收到的数据
}
引脚复用和功能重新映射
如果在 中将PB6 设置为串口功能,则可以发现PA9 已成为公共引脚。
这意味着PA9和PB6都可以用作串口1的TX引脚,但不能同时使用。 引脚有点像外围设备的插座。 外设可以从前门或后门出去,但不能同时从前门和后门出去。
引脚的功能不止一种,我们可以称之为引脚的复用; 例如可以作为普通IO,用来操作LED或者按钮,还可以作为串口使用。
外设不仅可以连接到引脚x,还可以连接到引脚y,我们称之为重映射。 STM32 MCU功能更强大,外设也很多。 外设默认对应某个引脚,可以通过重映射将外设映射到其他引脚,以充分利用片上资源。
详细的引脚重新映射可以在数据表的表 9 中找到。