目录
使用串口的三种方法(直接调用hal库、printf、中断方式)
芯片基本外设配置
- 在SYS里面开启Serial Wire调试接口
- 在RCC里面使能HSE (Crystal/Ceramic Resonator)
配置时钟树
选中“HSE”、"PLLCLK",在HCLK(MHz)中输入64,回车,软件会自动配置数值。
配置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
其他参数默认值。
生成代码后,在MDK软件中打开,在debug中设置“Reset and Run”。
使用串口的三种方法(直接调用hal库、printf、中断方式)
第一种方法(直接调用HAL库)
在int main()主函数中写入如下代码
uint8_t temp_buf[1]="c"; //定义一个数组,这个数组长度可以自定义
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000);
HAL_UART_Transmit(&huart1,temp_buf,1,10); //使用usart1串口每一秒发送字符c
}
uint8_t temp_buf=109; //定义整数,
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000);
HAL_UART_Transmit(&huart1,&temp_buf,1,10); //使用usart1串口每一秒发送字符m
}
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
UART_HandleTypeDef *huart:指定串口,usart1就是&huart1。usart2就是改为&huart2。
uint8_t *pData:就是要发送的数据
uint16_t Size:单位为字节,至少要比发送数据长度要大。
uint32_t Timeout:超时时间
第二种方法(printf)
- 在main.c文件中添加头文件
#include <stdio.h>
- main.c文件中加入重定向函数 ,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数
/* USER CODE BEGIN 0 */
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 0 */
- 在int main主函数while循环中加入代码
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000); //延时一秒钟输出字符b
printf("b\r\n");
}
/* USER CODE END 3 */
第三种方法(使用中断)
- 在CubeMX中,设置USART1全局中断使能,然后重新生成代码。
- 在main.c文件中定义变量
uint8_t TX_Buff[]="THIS IS A MESSAGE!\r\n"; //发送缓存
uint8_t RX_Buff[2]; //接收缓存
- 在int main主函数中,MX_USART1_UART_Init();后面写入串口输出函数
HAL_UART_Transmit_IT(&huart1,TX_Buff,sizeof(TX_Buff)); //用于第一的串口输出信息
- 在while(1)循环中,加入接收中断函数
/*
*2表示缓冲字节,发送的字节数要于缓冲的一致。如果发送长度小于2,则等到2字节后再显示出来
*/
HAL_UART_Receive_IT(&huart1,RX_Buff,2);
- 再int main函数后面写上中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
HAL_UART_Transmit(&huart1,(uint8_t*)RX_Buff,2,100);
}
- 编译,下载到开发板即可