11.20改
配置中打开NVIC中断,定义全局变量
uint8_t buff[5];
uint32_t PWM1;
uint32_t PWM2;
while循环前面加上HAL_UART_Receive_IT(&huart1,buff,3);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
// 假设接收到的数据是两个连续的字节
PWM1 = buff[0];
PWM2 = buff[1];
HAL_UART_Receive_IT(&huart1,buff,3);
HAL_UART_Transmit_IT(&huart1, buff, sizeof(buff));
}
}
回调函数放在main函数后面即可
7.21
接收口要用上拉输入
2.中断接收,配置完中断函数void USART1_IRQHandler(void)
找回调函数HAL_UART_IRQHandler(&huart1);CTRL+点击进入。
在下面找到HAL_UART_RxCpltCallback复制到主函数。
if(Serial_GetRxFlag() == 1){
Serial_SendByte(ByteRecv);
OLED_ShowHexNum(1,8,ByteRecv,2);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
uint8_t Serial_GetRxFlag(void);
uint8_t Serial_RxFlag;
uint8_t ByteRecv;
uint8_t Serial_GetRxFlag(void)
{
if (Serial_RxFlag == 1) //如果标志位为1
{
Serial_RxFlag = 0;
return 1; //则返回1,并自动清零标志位
}
return 0; //如果标志位为0,则返回0
}
uint8_t Serial_GetRxData(void)
{
return ByteRecv; //返回接收的数据变量
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart1){
Serial_RxFlag = 1;//已接受标志位
HAL_UART_Receive_IT(&huart1,&ByteRecv,1);//再次打开接收中断微瑕疵做准备
}
}
参考这个视频【STM32F4+CubeMX零基础快速入门】串口收发全攻略_哔哩哔哩_bilibili
定义一个变量
uint8_t buffer[5];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit_IT(&huart1,&ByteRecv,3);
HAL_UART_Receive_IT(&huart1,&ByteRecv,3);
}
while循环前加一个
HAL_UART_Receive_IT(&huart1,&ByteRecv,3);
使用中断每个字节都进入中断,DMA是不需要的,只需要CPU告诉存放的位置就可以搬运数据。
DMA后面还有空闲中断,对不定长数据进行响应。