我想在中断模式下使用 UART 通信,我应该把我的功能放在哪里?
I am trying to use UART communication in interrupt mode, where should i put my function?
我是 USART 通信的新手,如果我问了一个愚蠢的问题,请原谅我。
我正在使用 STM32F0discovry 开发板和使用 IAR EWARM 的代码。
我的主要功能如下所示。
我在主函数之后还有一个 HAL_UART_RxCpltCallback 函数。
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
NVIC_EnableIRQ(USART1_IRQn);
//HAL_UART_Receive_IT(&huart1,buffer,1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//HAL_UART_Receive(&huart1,buffer2,10); // unit: milli second
HAL_UART_Receive_IT(&huart1,buffer,1); // unit: milli second
HAL_Delay(100);
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0))
{
HAL_UART_Transmit(&huart1,buffera,1,100);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET);
}
}
/* USER CODE END 3 */
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(buffer[0] == 'a' )
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
}
else if(buffer[0] == 'b' )
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
}
else if(buffer[0] == 'c' )
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
}
//HAL_UART_Receive_IT(&huart1,buffer,1); // unit: milli second
}
我正在阅读一些教程,想知道是否应该将我的函数放在 USART1_IRQHandler 函数中。
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
或者我应该将我的代码放在 HAL_UART_RxCpltCallback 函数中吗?
我很困惑,感谢您花时间阅读本文!
void USART1_IRQHandler(void)
是触发 USART1 IRQ 时由 CPU 执行的实际中断处理程序。它通过调用 HAL_UART_IRQHandler(&huart1);
.
将实际工作委托给 STM32 HAL
HAL_UART_IRQHandler
是所有 UART 中断的通用 IRQ 处理程序,这就是为什么它需要一个 UART 句柄以便它知道是什么 UART 触发了中断。
HAL_UART_IRQHandler
通过查询触发中断的 UART 的实际状态位来确定实际发生了什么事件。基于此,它调用实际的处理函数。
处理函数然后执行实际工作。如果您开始接收并且已接收到所有请求的字节,它将调用 HAL_UART_RxCpltCallback
.
在那里你应该检查是否为你期望的 UART 调用了函数,然后你可以处理数据。
这样的回调函数有很多,可以在HAL的文档中找到。
我是 USART 通信的新手,如果我问了一个愚蠢的问题,请原谅我。
我正在使用 STM32F0discovry 开发板和使用 IAR EWARM 的代码。 我的主要功能如下所示。 我在主函数之后还有一个 HAL_UART_RxCpltCallback 函数。
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
NVIC_EnableIRQ(USART1_IRQn);
//HAL_UART_Receive_IT(&huart1,buffer,1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//HAL_UART_Receive(&huart1,buffer2,10); // unit: milli second
HAL_UART_Receive_IT(&huart1,buffer,1); // unit: milli second
HAL_Delay(100);
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0))
{
HAL_UART_Transmit(&huart1,buffera,1,100);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET);
}
}
/* USER CODE END 3 */
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(buffer[0] == 'a' )
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
}
else if(buffer[0] == 'b' )
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
}
else if(buffer[0] == 'c' )
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
}
//HAL_UART_Receive_IT(&huart1,buffer,1); // unit: milli second
}
我正在阅读一些教程,想知道是否应该将我的函数放在 USART1_IRQHandler 函数中。
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
或者我应该将我的代码放在 HAL_UART_RxCpltCallback 函数中吗? 我很困惑,感谢您花时间阅读本文!
void USART1_IRQHandler(void)
是触发 USART1 IRQ 时由 CPU 执行的实际中断处理程序。它通过调用 HAL_UART_IRQHandler(&huart1);
.
HAL_UART_IRQHandler
是所有 UART 中断的通用 IRQ 处理程序,这就是为什么它需要一个 UART 句柄以便它知道是什么 UART 触发了中断。
HAL_UART_IRQHandler
通过查询触发中断的 UART 的实际状态位来确定实际发生了什么事件。基于此,它调用实际的处理函数。
处理函数然后执行实际工作。如果您开始接收并且已接收到所有请求的字节,它将调用 HAL_UART_RxCpltCallback
.
在那里你应该检查是否为你期望的 UART 调用了函数,然后你可以处理数据。
这样的回调函数有很多,可以在HAL的文档中找到。