【二】STM32F4 USART1 中断方式接收再将字符打印出来

  1. void USART1_Config(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure;
  4.     USART_InitTypeDef USART_InitStructure;

  5.     /* config USART1 clock */
  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  7.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  8.     /* USART1 GPIO config */
  9.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  10.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  11.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.   GPIO_Init(GPIOB, &GPIO_InitStructure);

  13.   GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_USART1);
  14.   GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_USART1);    
  15.     /* USART1 mode config */
  16.     USART_InitStructure.USART_BaudRate = 115200;
  17.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  18.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  19.     USART_InitStructure.USART_Parity = USART_Parity_No ;
  20.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  21.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  22.     USART_Init(USART1, &USART_InitStructure);
  23.    /*使能中断*/
  24.     USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  25.     USART_Cmd(USART1, ENABLE);
  26. }

还需要配置NVIC

void NVIC_Config(void)
{
   NVIC_InitTypeDef NVIC_InitStructure;
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);
}

在以上函数中,NVIC_IRQChannel 是中断源,可以到STM32F4XX.H的140行处找,

第二项Preemption是中断组,中断组之间可以嵌套,0代表最高。

第三项是每个中断组里的中断成员,成员之间区分优先级,但一个组里的不可以嵌套。

第四项代表使能中断。

好了,NVIC配置好了后,就可以在stm32f4xx_it里添加中断服务函数了。

void USART1_IRQHandler(void)
{
char c;
 if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)
 {
   c = USART_ReceiveData(USART1);
     USART_SendData(USART1,c);
 USART_ClearITPendingBit(USART1,USART_IT_RXNE);
 GPIO_ToggleBits(GPIOD,GPIO_Pin_14);
 }
}

中断服务函数工作很简单,就是将接收到的数据再通过SendData发送出去。

同时为了便于观察是否进入中断,添加了取反GPIOD14的操作,对应discovery板子上的红色LED。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于STM32F4使用串口中断服务函数控制LED灯的例子。您可以在串口中输入“LED ON”或“LED OFF”来控制LED灯的开关。 首先,您需要在STM32F4上设置串口通信并连接到PC。然后,您需要将LED连接到STM32F4的GPIO引脚,并在代码中初始化该引脚。 接下来,您需要编写代码以读取串口中的字符串并将其与“LED ON”或“LED OFF”进行比较。如果字符串匹配,则打开或关闭LED。 下面是一个简单的示例代码: ```c #include "stm32f4xx.h" void init_led(void); void init_uart(void); void uart_send_string(char *str); volatile char rx_buffer[8]; volatile uint8_t rx_index = 0; volatile uint8_t rx_complete = 0; int main(void) { init_led(); init_uart(); while(1) { if(rx_complete) { rx_complete = 0; // 比较字符串并控制LED if(strncmp(rx_buffer, "LED ON", 6) == 0) { GPIO_SetBits(GPIOA, GPIO_Pin_5); } else if(strncmp(rx_buffer, "LED OFF", 7) == 0) { GPIO_ResetBits(GPIOA, GPIO_Pin_5); } memset(rx_buffer, 0, 8); rx_index = 0; } } } void init_led(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } void init_uart(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); USART_InitStructure.USART_BaudRate = 9600; 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(USART2, &USART_InitStructure); USART_Cmd(USART2, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); } void uart_send_string(char *str) { while(*str) { while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); USART_SendData(USART2, *str++); } } void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) { char rx_data = USART_ReceiveData(USART2); if(rx_index < 7) { rx_buffer[rx_index++] = rx_data; } else { rx_index = 0; } if(rx_data == '\n') { rx_complete = 1; } } } ``` 在此示例代码中,我们使用了STM32F4的串口中断服务函数来读取串口中的数据,并将其存储在rx_buffer数组中。当收到换行符时,我们将rx_complete标志设置为1,以指示已读取完整的字符串。 请注意,此代码仅用于演示目的,并且可能需要进行适当的更改才能与您的硬件设置兼容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值