一、硬件连接
将PA9和RXD连接PA10和TXD连接
二、cubemx配置
以正点原子精英版stm32f103zet6为例
sys配置
rcc(时钟)配置
gpio配置(led灯)
usart1配置
打开usart1中断
二、keil5代码
(1)利用printf函数打印
1、printf函数部分
首先在usart1.c中引用stdio.h
在usart1.c中重定向printf函数
/**
* 函数功能: 重定向c库函数printf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/**
* 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
2、接收中断回调函数部分
usart1.c文件中定义接收的数组
uint8_t aRxBuffer1[1];
定义中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //接收完成中断
{
if(huart->Instance == USART1)
{
if(aRxBuffer1[0] == 'a') //如果从电脑接收的数据为‘a’,
{
printf("RX Correct!\r\n"); //串口打印
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5); //则反转PB5的电平
}
}
HAL_UART_Receive_IT(&huart1,aRxBuffer1,1);
//重新打开串口中断,若无此语句,只能打开一次中断
}
3、main主函数部分
打开串口中断
HAL_UART_Receive_IT(&huart1,aRxBuffer1,1); //最后的1表示接收一次进行一次中断
while循环函数添加代码
if(aRxBuffer1[0]=='b') //如果接收的数据为‘b’
{
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5); //翻转PE5的电平
}
(2)利用HAL_UART_Transmit实现
首先在main函数中定义一个数组
uint8_t temp[]="usart test\r\n";
然后在while中添加相关代码
HAL_UART_Transmit(&huart1,temp,15,10000);
HAL_Delay(500);
三、实验结果xcom部分
(1)printf实验
验证串口代码部分,电脑发送a给32,单片机回应,同时PB5的LED灯电平翻转(亮变暗或暗变亮)
验证主函数部分代码,发送b另一个led灯电平翻转
实验成功
(2)HAL_UART_Transmit实验
下载到单片机复位后每0.5s发送一个“usart test”
实验成功