Forty_8 2024-10-31 21:40 采纳率: 81.3%
浏览 4
已结题

基于STM32F103ZET6库函数串口中断点亮LED灯仅能接收无法发送数据

题目:基于STM32F103ZET6库函数串口中断点亮LED灯
问题:在编写基于STM32F103ZET6库函数串口中断点亮LED灯时,我的板子仅能接收数据处理数据,但无法向我的电脑串口助手发送数据,我在编写字符点亮LED灯的代码就可以成功发送,所以我的串口助手是好的;
已知我的LED1在PB5,LED2在PE5,USART的Tx\Rx分别在PA9/10,发送字节“AB000000”,其中“AB”为协议头,第一个“01”点亮LED1,第二个“01”点亮LED2,最后的“00”为保留字符。以下是我的代码
代码:


```c
#include "stm32f10x.h"

u8 index;
u8 Flag;
char String[10];
char Down_String[] = "AB000000\n";
char Head[] = "AB";

void delay_ms(int32_t ms)
{
    int32_t i;
    while(ms--)
    {
        i = 7500;
        while(i--);
    }
}

void USART1_configure(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructrue;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO,ENABLE);
    
//setting PA9 as USART1_Tx
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
//setting PA10 as USART1_Rx
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    
    USART_InitStructrue.USART_BaudRate = 9600;
    USART_InitStructrue.USART_WordLength = USART_WordLength_8b;
    USART_InitStructrue.USART_StopBits = USART_StopBits_1;
    USART_InitStructrue.USART_Parity = USART_Parity_No;
    USART_InitStructrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    
    USART_InitStructrue.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1,&USART_InitStructrue);
    
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    
    USART_Cmd(USART1,ENABLE);
    
    NVIC_InitStructure.NVIC_IRQChannel= USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
    NVIC_Init(&NVIC_InitStructure);
}

void LED1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}

void LED1_on(void)
{
    GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}

void LED1_off(void)
{
    GPIO_SetBits(GPIOB,GPIO_Pin_5);
}

void LED2_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE,&GPIO_InitStructure);
    GPIO_SetBits(GPIOE,GPIO_Pin_5);
}

void LED2_on(void)
{
    GPIO_ResetBits(GPIOE,GPIO_Pin_5);
}

void LED2_off(void)
{
    GPIO_SetBits(GPIOE,GPIO_Pin_5);
}

void Send_Byte(uint16_t Byte)
{
    USART_SendData(USART1, Byte);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  
}

void Serial_SendString(char * String)
{
    uint8_t i;
    for(i=0; String[i] != '\0'; i++)
    {
        Send_Byte(String[i]);
    }
}

char Get_LEDInfo(void)
{
    // LED1 
    if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5)==1)
    { 
        Down_String[3] = '0';
    }
    else{
        Down_String[3] = '1';
    }
    // LED2
    if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5)==1)
    { 
        Down_String[5] = '0';
    }
    else{
        Down_String[5] = '1';
    }
    return Down_String[7];
}

uint8_t ReadRx(char * String)
{
    uint8_t j;
    for(j=0; j<2; ++j)
    {
        if(String[j] != Head[j])
        {
            return 0;
        }
    }
    if(String[2] =='0' && String[3] == '1')
    {
        LED1_on();
    }
    else if(String[2] =='0' && String[3] == '0')
    {
        LED1_off();
    }
    else
    {
        return 0;
    }
    
    if(String[4] =='0' && String[5] == '1')
    {
        LED2_on();
    }
    else if(String[4] =='0' && String[5] == '0')
    {
        LED2_off();
    }
    else
    {
        return 0;
    }

    return 1;
}

void Print(void)
{
    if(Flag == 0)
    {
        Serial_SendString("Failed!\n");
        Serial_SendString(Down_String);
    }
    else
    {
        Serial_SendString( "Successful!\n");
        Serial_SendString(Down_String);
    }
    Flag = 0;
}

void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET) 
    {        
        uint8_t Serial_RxData;
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        
        Serial_RxData = USART_ReceiveData(USART1); 
        String[index++] = (char)Serial_RxData;
        
    }
}

    int main(void)
{
    USART1_configure();
    LED1_Init();
    LED2_Init();
    
  while (1)
  {
        if(index >= 8)
        {
            Flag = ReadRx((char *)String);
            Print();
            index = 0;
        }    
    }
}

```

  • 写回答

1条回答 默认 最新

  • 月下独码 Java领域新星创作者 2024-11-04 11:49
    关注

    本答案参考 多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢

    1. 问题分析
      • 在代码中,存在一些初始化函数中的引脚配置错误。例如,在USART1_configure函数中,USART1Tx引脚PA9Rx引脚PA10的初始化,代码中错误地使用了GPIOB进行初始化,应该使用GPIOA
      • Send_Byte函数中,while循环等待发送完成的条件可能存在问题。USART_FLAG_TXE表示发送数据寄存器为空,但这并不一定意味着数据已经完全发送出去。可能需要等待USART_FLAG_TC(发送完成标志)来确保数据发送完成。
    2. 代码修正
      • 修正USART1_configure函数中的引脚初始化
        • USART1TxRx引脚的初始化修改为使用GPIOA
      • 修正Send_Byte函数中的等待条件
        • 修改为等待USART_FLAG_TC(发送完成标志)。

    以下是修正后的代码:

    #include "stm32f10x.h"
    
    u8 index;
    u8 Flag;
    char String[10];
    char Down_String[] = "AB000000\n";
    char Head[] = "AB";
    
    void delay_ms(int32_t ms)
    {
        int32_t i;
        while(ms--)
        {
            i = 7500;
            while(i--);
        }
    }
    
    void USART1_configure(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructrue;
        NVIC_InitTypeDef NVIC_InitStructure;
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO,ENABLE);
    
    //setting PA9 as USART1_Tx
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
    //setting PA10 as USART1_Rx
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
    
        USART_InitStructrue.USART_BaudRate = 9600;
        USART_InitStructrue.USART_WordLength = USART_WordLength_8b;
        USART_InitStructrue.USART_StopBits = USART_StopBits_1;
        USART_InitStructrue.USART_Parity = USART_Parity_No;
        USART_InitStructrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    
        USART_InitStructrue.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART1,&USART_InitStructrue);
    
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    
        USART_Cmd(USART1,ENABLE);
    
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_Init(&NVIC_InitStructure);
    }
    
    void LED1_Init(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);
    }
    
    void LED1_on(void)
    {
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);
    }
    
    void LED1_off(void)
    {
        GPIO_SetBits(GPIOB,GPIO_Pin_5);
    }
    
    void LED2_Init(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOE,&GPIO_InitStructure);
        GPIO_SetBits(GPIOE,GPIO_Pin_5);
    }
    
    void LED2_on(void)
    {
        GPIO_ResetBits(GPIOE,GPIO_Pin_5);
    }
    
    void LED2_off(void)
    {
        GPIO_SetBits(GPIOE,GPIO_Pin_5);
    }
    
    void Send_Byte(uint16_t Byte)
    {
        USART_SendData(USART1, Byte);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);  
    }
    
    void Serial_SendString(char * String)
    {
        uint8_t i;
        for(i = 0; String[i]!='\0'; i++)
        {
            Send_Byte(String[i]);
        }
    }
    
    char Get_LEDInfo(void)
    {
        // LED1 
        if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5)==1)
        {
            Down_String[3] = '0';
        }
        else{
            Down_String[3] = '1';
        }
        // LED2
        if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5)==1)
        {
            Down_String[5] = '0';
        }
        else{
            Down_String[5] = '1';
        }
        return Down_String[7];
    }
    
    uint8_t ReadRx(char * String)
    {
        uint8_t j;
        for(j = 0; j < 2; ++j)
        {
            if(String[j]!=Head[j])
            {
                return 0;
            }
        }
        if(String[2] =='0' && String[3] == '1')
        {
            LED1_on();
        }
        else if(String[2] =='0' && String[3] == '0')
        {
            LED1_off();
        }
        else
        {
            return 0;
        }
    
        if(String[4] =='0' && String[5] == '1')
        {
            LED2_on();
        }
        else if(String[4] =='0' && String[5] == '0')
        {
            LED2_off();
        }
        else
        {
            return 0;
        }
    
        return 1;
    }
    
    void Print(void)
    {
        if(Flag == 0)
        {
            Serial_SendString("Failed!\n");
            Serial_SendString(Down_String);
        }
        else
        {
            Serial_SendString("Successful!\n");
            Serial_SendString(Down_String);
        }
        Flag = 0;
    }
    
    void USART1_IRQHandler(void)
    {
        if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
        {
            uint8_t Serial_RxData;
            USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    
            Serial_RxData = USART_ReceiveData(USART1);
            String[index++] = (char)Serial_RxData;
    
        }
    }
    
    int main(void)
    {
        USART1_configure();
        LED1_Init();
        LED2_Init();
    
        while (1)
        {
            if(index >= 8)
            {
                Flag = ReadRx((char *)String);
                Print();
                index = 0;
            }
        }
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月9日
  • 已采纳回答 11月9日
  • 创建了问题 10月31日

悬赏问题

  • ¥20 verilog状态机方法流水灯
  • ¥15 pandas代码实现不了意图
  • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强