OpenEdv-开源电子网

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

串口如何实现引脚位置分时切换(1分2)

[复制链接]

30

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
594
金钱
594
注册时间
2014-4-3
在线时间
74 小时
发表于 2021-7-6 00:22:39 | 显示全部楼层 |阅读模式
1金钱
比如串口1,希望在PA9、PA10位置使用一段时间,然后自动切换到PB6、PB7,然后再来回切换实现串口1分2的效果,
参照版主的例程,切换时重新初始化串口配置IO口映射),结果是:串口在2个位置都能发送输出,无法进入接收中断,先用HAL库失败,再换寄存器操作,仍然无法进入接收中断,不知道怎么搞?请大神帮忙!
void uart_init(u32 pclk2,u32 bound)(原子的原装正版
{           
        float temp;
        u16 mantissa;
        u16 fraction;          
        temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV@OVER8=0
        mantissa=temp;                                 //得到整数部分
        fraction=(temp-mantissa)*16; //得到小数部分@OVER8=0
    mantissa<<=4;
        mantissa+=fraction;
        RCC->AHB1ENR|=1<<0;           //使能PORTA口时钟  
        RCC->APB2ENR|=1<<4;          //使能串口1时钟
        GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出
        GPIO_AF_Set(GPIOA,9,7);        //PA9,AF7
        GPIO_AF_Set(GPIOA,10,7);//PA10,AF7            
        //波特率设置
        USART1->BRR=mantissa;         //波特率设置         
        USART1->CR1&=~(1<<15);         //设置OVER8=0
        USART1->CR1|=1<<3;          //串口发送使能
#if EN_USART1_RX                          //如果使能了接收
        //使能接收中断
        USART1->CR1|=1<<2;          //串口接收使能
        USART1->CR1|=1<<5;            //接收缓冲区非空中断使能                   
        MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
#endif
        USART1->CR1|=1<<13;          //串口使能
}

void uart_init2(u32 pclk2,u32 bound)(自己稍微改动的
{           
        float temp;
        u16 mantissa;
        u16 fraction;          
        temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV@OVER8=0
        mantissa=temp;                                 //得到整数部分
        fraction=(temp-mantissa)*16; //得到小数部分@OVER8=0
    mantissa<<=4;
        mantissa+=fraction;
        RCC->AHB1ENR|=1<<1;           //使能PORTA口时钟  
        //RCC->APB2ENR|=1<<4;          //使能串口1时钟
        GPIO_Set(GPIOB,PIN6|PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PB6\7,复用功能,上拉输出
        GPIO_AF_Set(GPIOB,6,7);        // PB6,AF7
        GPIO_AF_Set(GPIOB,7,7);     // PB7,AF7            
        //波特率设置
        USART1->BRR=mantissa;         //波特率设置         
        USART1->CR1&=~(1<<15);         //设置OVER8=0
        USART1->CR1|=1<<3;          //串口发送使能
#if EN_USART1_RX                          //如果使能了接收
        //使能接收中断
        USART1->CR1|=1<<2;          //串口接收使能
        USART1->CR1|=1<<5;            //接收缓冲区非空中断使能                   
        MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
#endif
        USART1->CR1|=1<<13;          //串口使能
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2020-8-19
在线时间
335 小时
发表于 2021-7-6 12:53:13 | 显示全部楼层
重新配置初始化,包括中断那些也需要两个,可以用宏定义来切换
回复

使用道具 举报

30

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
594
金钱
594
注册时间
2014-4-3
在线时间
74 小时
 楼主| 发表于 2021-9-6 21:01:46 | 显示全部楼层
中断要两个,用宏定义来切换?请问具体如何实现?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 03:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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