HAL库表达 //Usart3 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
时间: 2023-12-06 11:43:26 浏览: 174
这段代码使用STM32的HAL库来配置USART3的中断向量表(NVIC)。具体来说,它将USART3的中断通道号设置为USART3_IRQn,将抢占优先级设置为0,将子优先级设置为0,使能该中断通道,最后使用NVIC_Init函数将以上配置参数写入到对应的NVIC寄存器中。这样,当USART3产生中断时,系统会根据中断优先级自动调用对应的中断服务程序。
相关问题
换HAL库表达 //Usart3 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
使用HAL库对Usart3进行NVIC配置的代码如下:
```c
/* 配置USART3中断优先级 */
HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
/* 使能USART3中断 */
HAL_NVIC_EnableIRQ(USART3_IRQn);
```
其中,`HAL_NVIC_SetPriority`函数用于设置中断的抢占优先级和子优先级,第一个参数为中断号,第二个参数为抢占优先级,第三个参数为子优先级。本例中将抢占优先级和子优先级均设置为0。
`HAL_NVIC_EnableIRQ`函数用于使能中断,将中断号作为参数传入即可。
注意,在使用HAL库进行NVIC配置时,不需要显式地初始化NVIC_InitStructure结构体,而是直接调用相关的函数进行配置。
我需要实现一个关于HAL库的stm32f103ret6的keil代码,要求如下:我需要串口接收一个标志位lock,上位机通过232串口像我发送0或者1来操控lock里面的i/o口的调用函数,且此次接收的数据不循环接收,只接收一次;后我还需要接收一个get_temp_adc();get_temp_adc()是其他C文件的,接收这里面的数据,变成adc值来控制温度,get_temp_adc()
好的,根据您的要求,我编写了如下的代码:
```c
#include "stm32f10x.h"
#define LOCK_GPIO GPIOA
#define LOCK_PIN GPIO_Pin_12
void USART1_Init(void);
void USART1_IRQHandler(void);
void USART1_SendChar(uint8_t ch);
void USART1_SendString(char *str);
void GPIO_Configuration(void);
void SetLock(uint8_t state);
uint16_t get_temp_adc(void);
volatile uint8_t lock = 0;
volatile uint8_t temp_adc = 0;
int main()
{
SystemInit();
GPIO_Configuration();
USART1_Init();
while (1)
{
// 等待接收到lock标志位
while (!lock);
// 接收到lock标志位后,等待接收到上位机发送的0或1
uint8_t cmd = 0;
while (1)
{
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
{
cmd = USART_ReceiveData(USART1);
break;
}
}
// 根据接收到的指令,设置lock的输出状态
if (cmd == '0')
{
SetLock(0);
}
else if (cmd == '1')
{
SetLock(1);
}
// 接收get_temp_adc()函数的返回值
temp_adc = get_temp_adc();
}
}
void USART1_Init(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
/* Configure USART1 Rx (PA10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Tx (PA9) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure the USART1 */
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
/* Enable USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the USART1 */
USART_Cmd(USART1, ENABLE);
}
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
lock = 1;
}
}
void USART1_SendChar(uint8_t ch)
{
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
void USART1_SendString(char *str)
{
while (*str)
{
USART1_SendChar(*str++);
}
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* Configure LOCK_GPIO pin as output push-pull */
GPIO_InitStructure.GPIO_Pin = LOCK_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(LOCK_GPIO, &GPIO_InitStructure);
}
void SetLock(uint8_t state)
{
if (state)
{
GPIO_SetBits(LOCK_GPIO, LOCK_PIN);
}
else
{
GPIO_ResetBits(LOCK_GPIO, LOCK_PIN);
}
}
uint16_t get_temp_adc(void)
{
// 这里调用其他C文件中的get_temp_adc()函数来获取温度值
// 省略具体实现
return 0;
}
```
该代码实现了以下功能:
1. 初始化USART1和GPIOA,并配置PA9为USART1的TX引脚,PA10为USART1的RX引脚,PA12为锁的输出引脚。
2. 当接收到上位机发送的数据时,判断是否为lock标志位,如果是则设置lock变量为1。
3. 接收到lock标志位后,等待接收到上位机发送的0或1,根据接收到的指令,设置lock的输出状态。
4. 接收get_temp_adc()函数的返回值,并存储在temp_adc变量中。
阅读全文