OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 986|回复: 0

将stmf103串口输出电压从3.3V转变5V,程序将TX、rx状态取反还是输出乱码该怎么修改程序

[复制链接]

2

主题

3

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2021-12-23
在线时间
23 小时
发表于 2024-1-25 11:07:27 | 显示全部楼层 |阅读模式
25金钱
串口程序:(尝试更改串口引脚取反但会出现乱码)
void USART5_init(u32 bound)
{
    //GPIO端口设置
    GPIO_InitTypeDef  GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef  NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);        //使能USART5 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,  ENABLE);        //使能GPIOC/D  时钟

    USART_DeInit(UART5);  //复位串口5


    //USART5_TX   PC.12
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;        //PC.12
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //复用推挽输出
    GPIO_Init(GPIOC, &GPIO_InitStructure);           //初始化PC12

    //USART5_RX          PD.2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOD, &GPIO_InitStructure);               //初始化PD2

    //Usart5 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                  //子优先级2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);                                //根据指定的参数初始化VIC寄存器

    //USART5 初始化设置
    USART_InitStructure.USART_BaudRate = bound;             //一般设置为9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    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(UART5, &USART_InitStructure);     //初始化串口
    USART_ITConfig(UART5, USART_IT_IDLE, ENABLE);//开启空闲中断
    USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);//开启接收中断
    USART_Cmd(UART5, ENABLE);                    //使能串口
}


/************************************************************************************************
函数名: Uart5_Send_String
功  能: Uart5发送字符串
输  入: str: 要发送的字符串数组
        len:  要发送的数据长度
返  回: 无
************************************************************************************************/
void USART5_Send_String(unsigned char *str)
{
    unsigned char i=0;       //定义一个局部变量  用来 发送字符串 ++运算
    while(str[i]!='\0')      // 每个字符串结尾 都是以  \0 结尾的
    {
        USART_SendData(UART5,str[i]);                           //通过库函数  发送数据
        while( USART_GetFlagStatus(UART5,USART_FLAG_TC)!= SET); //等待发送完成。   检测 USART_FLAG_TC 是否置1;
        i++;
    }
}


/************************************************************************************************
函数名: USART5_Send_Array
功  能: USART5发送一个数组
输  入: TxData    : 要发送的数组
        Datalength:  要发送的数据长度
返  回: 无
************************************************************************************************/
void USART5_Send_Array(unsigned char *TxData,unsigned int len)
{
    unsigned int i ;

    for(i=0; i< len; i++)                                              //循环发送
    {
        USART_SendData(UART5, TxData[i]);                                                                   // 发送数据
        while(USART_GetFlagStatus(UART5, USART_FLAG_TC) == RESET);                   // 等待发送完成
    }
}


/************************************************************************************************
函数名: USART5_ReadFrame
功  能: 读取Uart5接收到的数据
输  入: data: 接收到的数据
返  回: 接收数据的长度
************************************************************************************************/
u16 USART5_ReadFrame( u8 *data,u16 time)   
{
    u16 i=0;
    u16 length=0;
    delay_ms(time);
    if(USART5_Rx_Finish)
    {
        USART5_Rx_Finish = 0;
        for(i=0;i<Rx5_count;i++)
        {
            data[i]=USART5_RX_BUF[i];
        }
        length = Rx5_count;
        Rx5_count=0;
        GEN_ArrayClear(USART5_RX_BUF,USART5_REC_LEN);
    }
    return  length;

}

/************************************************************************************************/
//USART5中断服务函数
void USART5_IRQHandler(void)                                        //串口5中断服务程序
{
    volatile char Res;
    volatile u8 temp=0;
    if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)     //接收中断,可以扩展来控制
    {
        Res=USART_ReceiveData(UART5);                        //接收模块的数据;
        USART5_RX_BUF[Rx5_count++] =USART_ReceiveData(UART5);//接收模块的数据
        if(Rx5_count>=USART5_REC_LEN)
        {
            Rx5_count=0;
        }
    }
    if(USART_GetITStatus(UART5, USART_IT_IDLE) != RESET)     //模块空闲
    {
        UART5->SR;                                    //先读SR,再读DR才能完成idle中断的清零,否则会一直进入中断。
        UART5->DR;
        //      Res=USART_ReceiveData(USART2);                        //接收模块的数据;
        USART5_Rx_Finish=1;
    }
}

PC12、PD2分别为stm32f103rct6芯片中uart的rx、tx,经过三极管将输出电压从3.3V转换为5V

PC12、PD2分别为stm32f103rct6芯片中uart的rx、tx,经过三极管将输出电压从3.3V转换为5V
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 13:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表