串行接口相关知识
USART1_TX与PA9复用,USART1_RX与PA10复用。
USART2_TX与PA2复用,USART2_RX与PA3复用。
STM32CubeMX中关于USART的配置
注意:(1)Mode模式设置为异步通信;(2)波特率配置要与上位机选择的一致;
HAL库中串口发送的重要函数(重点)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
四个参数:使用哪个串口;需要发送的数据(是字符串还是字节获数组);数据大小;设定的发送时间;
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
串口发送数据实例
HAL_UART_Transmit_IT(&huart1,&dat_Txd,5);//调用非阻塞式的串口发送函数
void HAL_UART_TxCpltCalback(UART_HandleTypeDef *huart)//发送完毕中断回调函数
{
if(huart->Instance == USART1)//判断是否为串口1
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
}
}
HAL_UART_Transmit(&huart1, &dat_Txd, 5, 10000);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
HAL库中串口接收的重要函数(重点)
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
串口接收数据实例
HAL_UART_Receive_IT(&huart1,&dat_Rxd,1);//调用非阻塞式的串口发送函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)//判断是否为串口1
{
if(huart->Instance == USART1)
{
if(dat_Rxd == 0x5A)
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}
}
}
综合实训
在STM32F103C8T6开发板上,连接相关外电路, 还需要一个串口,利用STM32CubeMX和Keil5协同开发,完成以下的功能。
【1】开机后,向串口1发送“hello world ! ”。
【2】串口1收到字节指令“OxA1”,PB9输出高电平,发送“LED1 Open ! ”。
【3】串口1收到字节指令“OxA2”,PB9输出低电平,发送“LED1 Closed! ”。
【4】在串口发送过程中,翻转PB8作为发送数据指示灯。
(1)cubmx配置
在本文第2点关于USART的配置基础下勾选中断,并将波特率修改为9600。
(2)Keil5编写代码
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/*宏定义*/
#define LED1_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
#define LED1_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
#define LED2_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
#define LED2_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
uint8_t Tx_str1[] = "hello world!\r\n";
uint8_t Tx_str2[] = "LED1 Open!\r\n";
uint8_t Tx_str3[] = "LED1 Close!\r\n";
uint8_t RX_dat = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)//判断是否为串口1
{
if(huart->Instance == USART1)
{
if(RX_dat == 0xa1)
{
LED1_ON();
LED2_ON();
HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str2),10000);
LED2_OFF();
HAL_UART_Receive_IT(&huart1,&RX_dat,1);
}
else if(RX_dat == 0xa2)
{
LED1_OFF();
LED2_ON();
HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str3),10000);
LED2_OFF();
HAL_UART_Receive_IT(&huart1,&RX_dat,1);
}
}
}
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
LED2_ON();
HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),10000);
LED2_OFF();
HAL_UART_Receive_IT(&huart1,&RX_dat,1);
/* USER CODE END 2 */
操作完毕!