OpenEdv-开源电子网

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

大佬看下这串口4的初始化写的对不对,仿照串口3写的,引脚为PB3和PB5

[复制链接]

14

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2020-11-3
在线时间
26 小时
发表于 2022-2-26 16:36:56 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 上学人123 于 2022-2-26 16:59 编辑

//串口4初始化               
///////////////////////
//////蓝牙用///////////
///////////////////////
//串口发送缓存区         
__align(8) u8 UART4_TX_BUF[UART4_MAX_SEND_LEN];               //发送缓冲,最大UART4_MAX_SEND_LEN字节
#ifdef UART4_RX_EN                                                                         //如果使能了接收            
//串口接收缓存区         
u8 UART4_RX_BUF[UART4_MAX_RECV_LEN];                                       //接收缓冲,最大UART4_MAX_RECV_LEN个字节.

UART_HandleTypeDef UART4_Handler;                         //UART句柄


//初始化IO,串口4
//bound:波特率
void UART4_init(u32 bound)
{        
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_Initure;

        __HAL_RCC_GPIOB_CLK_ENABLE();                                      //使能GPIOB时钟
        __HAL_RCC_UART4_CLK_ENABLE();                                      //使能UART4时钟

        //UART 初始化设置
        UART4_Handler.Instance=UART4;                                              //UART4
        UART4_Handler.Init.BaudRate=bound;                                      //波特率
        UART4_Handler.Init.WordLength=UART_WORDLENGTH_8B;     //字长为8位数据格式
        UART4_Handler.Init.StopBits=UART_STOPBITS_1;              //一个停止位
        UART4_Handler.Init.Parity=UART_PARITY_NONE;                      //无奇偶校验位
        UART4_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;     //无硬件流控
        UART4_Handler.Init.Mode=UART_MODE_TX_RX;                      //收发模式
        HAL_UART_Init(&UART4_Handler);                                              //HAL_UART_Init()会使能UART4        

        GPIO_Initure.Pin=GPIO_PIN_3|GPIO_PIN_5;                              //PB10、PB11           改为PB3和PB5
        GPIO_Initure.Mode=GPIO_MODE_AF_PP;                              //复用推挽输出
        GPIO_Initure.Pull=GPIO_PULLUP;                                      //上拉
        GPIO_Initure.Speed=GPIO_SPEED_FAST;                              //高速
        GPIO_Initure.Alternate=GPIO_AF8_UART4;                      //复用为UART4
        HAL_GPIO_Init(GPIOB,&GPIO_Initure);                              //初始化PB10,和PB11    改为PB3和PB5
        
        __HAL_UART_DISABLE_IT(&UART4_Handler,UART_IT_TC);
        
#if UART4_RX_EN
        __HAL_UART_ENABLE_IT(&UART4_Handler,UART_IT_RXNE);    //开启接收中断
        HAL_NVIC_EnableIRQ(UART4_IRQn);                                          //使能UART4中断通道
        HAL_NVIC_SetPriority(UART4_IRQn,2,3);                              //抢占优先级2,子优先级3
#endif        
    TIM7_Init(100 - 1, 9000 - 1);                         //重新设置为10ms中断
    HAL_TIM_Base_Stop(&TIM7_Handler);                     //关闭定时器7
    UART4_RX_STA = 0;                                                    //清零

}
//蓝牙扫描下:   timer=1S
//非蓝牙扫描下: timer=10ms
//通过判断接收连续2个字符之间的时间差不大于timer来决定是不是一次连续的数据.
//如果2个字符接收间隔超过timer,则认为不是1次连续数据.也就是超过timer没有接收到
//任何数据,则表示此次接收完毕.
//接收到的数据状态
//[15]:0,没有接收到数据;1,接收到了一批数据.
//[14:0]:接收到的数据长度
u16 UART4_RX_STA=0;



//串口4中断服务程序
void UART4_IRQHandler(void)
{
        u8 Res;
    if ((__HAL_UART_GET_FLAG(&UART4_Handler, UART_FLAG_RXNE) != RESET))
    {
        HAL_UART_Receive(&UART4_Handler, &Res, 1, 1000);

        if ((UART4_RX_STA & 0x8000) == 0)           //接收完的一批数据,还没有被处理,则不再接收其他数据
        {
            if (UART4_RX_STA < UART4_MAX_RECV_LEN)  //还可以接收数据
            {
                    TIM7->CNT = 0;                       //计数器清空

                    if (UART4_RX_STA == 0)              //如果没有接收任何数据
                    {
                        HAL_TIM_Base_Start(&TIM7_Handler);//开启定时器8
                    }

                UART4_RX_BUF[UART4_RX_STA++] = Res; //记录接收到的值
            }
            else
            {
                UART4_RX_STA |= 1 << 15;                           //强制标记接收完成
            }
        }
    }        
}

//串口4,printf 函数
//确保一次发送数据不超过UART4_MAX_SEND_LEN字节
void u4_printf(char *fmt, ...)
{
    u16 i, j;
    va_list ap;
    va_start(ap, fmt);
    vsprintf((char *)UART4_TX_BUF, fmt, ap);
    va_end(ap);
    i = strlen((const char *)UART4_TX_BUF); //此次发送数据的长度

    for (j = 0; j < i; j++)              //循环发送数据
    {
        while ((UART4->ISR & 0X40) == 0); //循环发送,直到发送完毕

        UART4->TDR = UART4_TX_BUF[j];
    }
}

#endif
为什么u4_printf蓝牙用不了呢,其他配置皆没问题


最佳答案

查看完整内容[请看2#楼]

UART4的引脚是PC10和PC11注意
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2020-11-3
在线时间
26 小时
 楼主| 发表于 2022-2-26 16:36:57 | 显示全部楼层
UART4的引脚是PC10和PC11注意
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1732
金钱
1732
注册时间
2021-4-11
在线时间
320 小时
发表于 2022-2-26 16:37:52 | 显示全部楼层
验证一下不就知道了吗
回复

使用道具 举报

14

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2020-11-3
在线时间
26 小时
 楼主| 发表于 2022-2-26 16:39:49 | 显示全部楼层
救一手
回复

使用道具 举报

14

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2020-11-3
在线时间
26 小时
 楼主| 发表于 2022-2-26 16:43:49 | 显示全部楼层
/*BLE模块数据发送处理*/
void Ble_SendData(void)
{
    static u8 num = 0;

    u4_printf("ATK-BLE01 TEST %d\r\n", num);
    printf("S: ATK-BLE01 TEST %d\r\n", num);

    num++;
    if (num == 255) num = 0;

}

u4_printf("ATK-BLE01 TEST %d\r\n", num)    没反应
回复

使用道具 举报

14

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2020-11-3
在线时间
26 小时
 楼主| 发表于 2022-2-26 16:58:27 | 显示全部楼层
huanan 发表于 2022-2-26 16:37
验证一下不就知道了吗

已经验证了,就是串口4有问题
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1732
金钱
1732
注册时间
2021-4-11
在线时间
320 小时
发表于 2022-2-26 17:51:45 | 显示全部楼层
单独测试一下串口4,不要加上ble数据发送
回复

使用道具 举报

14

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2020-11-3
在线时间
26 小时
 楼主| 发表于 2022-2-26 17:56:27 | 显示全部楼层
huanan 发表于 2022-2-26 17:51
单独测试一下串口4,不要加上ble数据发送

单独用串口调试助手也不行,串口4没反应,
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 03:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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