Supersolo24 2023-10-02 15:37 采纳率: 80%
浏览 15
已结题

给予STM32按键中断与串口通信

用stm32实现流水灯启动,暂停,加速和减速,配置加速用的按键中断引脚为PB14,暂停用的按键引脚为PB11,配置如下

void key_init(void){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    GPIO_InitTypeDef GPIO_Initstructure;
    GPIO_Initstructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Initstructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14;
    GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_Initstructure);
    
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource11); //PB11 init
    
    EXTI_InitTypeDef EXTI_Initstructure_1;
    EXTI_Initstructure_1.EXTI_Line = EXTI_Line11;
    EXTI_Initstructure_1.EXTI_LineCmd = ENABLE;
    EXTI_Initstructure_1.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_Initstructure_1.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_Initstructure_1);
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_InitTypeDef NVIC_Initsturcture1;
    NVIC_Initsturcture1.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_Initsturcture1.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Initsturcture1.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_Initsturcture1.NVIC_IRQChannelSubPriority = 0;
    NVIC_Init(&NVIC_Initsturcture1);
    
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource11);//PB14 init
    
    EXTI_InitTypeDef EXTI_Initstructure_2;
    EXTI_Initstructure_2.EXTI_Line = EXTI_Line14;
    EXTI_Initstructure_2.EXTI_LineCmd = ENABLE;
    EXTI_Initstructure_2.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_Initstructure_2.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_Initstructure_2);
    
//    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_InitTypeDef NVIC_Initsturcture_2;
    NVIC_Initsturcture_2.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_Initsturcture_2.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Initsturcture_2.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_Initsturcture_2.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_Initsturcture_2);

在PA9和PA10上配置了串口通信USART,只用到了PA9作为发送端,配置函数如下

void serial_init(void){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);    
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    USART_InitTypeDef USART_Initstructure;
    USART_Initstructure.USART_BaudRate = 9600;
    USART_Initstructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_Initstructure.USART_Mode = USART_Mode_Tx;
    USART_Initstructure.USART_Parity = USART_Parity_No;
    USART_Initstructure.USART_StopBits = USART_StopBits_1;
    USART_Initstructure.USART_WordLength = USART_WordLength_8b;
    USART_Init(USART1,&USART_Initstructure);
    
    USART_Cmd(USART1,ENABLE);
}
void serial_sendbyte(uint8_t byte){
    USART_SendData(USART1,byte);
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
}

结果烧录程序的时候发现串口无法发送数据,是怎么回事,是按键的中断配置有问题吗

  • 写回答

15条回答 默认 最新

  • Java毕设王 2023-10-02 15:54
    关注
    获得0.75元问题酬金
    1. 按键引脚的配置:代码中配置了GPIOB的PB11和PB14为输入模式,并使能了上拉电阻。但需要注意按键的引脚和外部中断线的对应关系,以及是否正确配置了GPIO的外部中断线。

    2. 中断优先级配置:根据你的代码,NVIC_Initsturcture1和NVIC_Initsturcture_2的NVIC_IRQChannel都设置为EXTI15_10_IRQn,即PB11和PB14共用一个中断服务函数。它们的优先级配置也有问题,你将PB11的中断优先级设置为0,PB14的中断优先级设置为1。根据优先级分组为NVIC_PriorityGroup_2,优先级0为最高,那么PB11的中断优先级将高于PB14的中断优先级。如果你希望PB11的中断优先级高于PB14,那么可以将PB11的优先级设置更高。

    3. 串口发送:通过配置PA9为USART的发送引脚,以及相应的USART配置,你应该可以使用USART_SendData函数向串口发送数据。但需要确认是否连接了正确的串口设备,并且串口通信的波特率设置是否与接收端相匹配。

    为了更准确地定位问题,你可以通过以下几个步骤进行排查:

    1. 确认按键引脚的连接和配置是否正确。可以使用GPIO_ReadInputDataBit函数来读取按键引脚的状态,以确保按键按下时可以被正确检测到。

    2. 确认是否正确触发了外部中断,并进入了中断服务函数。可以在中断服务函数中添加调试信息,如通过串口打印一些信息,以检查是否进入了中断服务函数。

    3. 确认串口通信是否正常工作。可以通过将USART_Initstructure中的USART_Mode设置为USART_Mode_Rx来使串口同时支持接收和发送,在接收端口添加相应的处理代码,以检查是否可以接收到数据。

    评论

报告相同问题?

问题事件

  • 系统已结题 10月10日
  • 创建了问题 10月2日

悬赏问题

  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请