OpenEdv-开源电子网

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

关于STM32 HAL库例程 IO配置问题!

[复制链接]

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-7-12
在线时间
26 小时
发表于 2017-8-26 16:45:19 | 显示全部楼层 |阅读模式
2金钱
我在看原子的例程时,在使用HAL库时很多地方的输入IO口配置简化了。。我还特意去翻看了寄存器版本,发现寄存器版本是完整配置的!例如:HAL库串口1初始化时io配置
                __HAL_RCC_GPIOA_CLK_ENABLE();                        
                __HAL_RCC_USART1_CLK_ENABLE();               
        
                GPIO_Initure.Pin=GPIO_PIN_9;                        //PA9
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;               
                GPIO_Initure.Pull=GPIO_PULLUP;                        
                GPIO_Initure.Speed=GPIO_SPEED_FAST;               
                GPIO_Initure.Alternate=GPIO_AF7_USART1;        
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);           

                GPIO_Initure.Pin=GPIO_PIN_10;        
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                  

寄存器版本:
        RCC->AHB1ENR|=1<<0;            
        RCC->APB2ENR|=1<<4;         
        GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);
        GPIO_AF_Set(GPIOA,9,7);        //PA9,AF7
        GPIO_AF_Set(GPIOA,10,7);//PA10,AF7  

PA9、10都重映射了AF7.。也就是USART1,这是为什么呢?
HAL库有自动设置功能吗?我找了一下没找见,求解答!

最佳答案

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

本来是这样写好看些, GPIO_Initure.Pin=GPIO_PIN_9; GPIO_Initure.Mode=GPIO_MODE_AF_PP; ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-26 16:45:20 | 显示全部楼层
本帖最后由 huanghan 于 2017-8-29 14:46 编辑

本来是这样写好看些,                                                                                                                                                                                                                                                                                    GPIO_Initure.Pin=GPIO_PIN_9;   
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;               
                GPIO_Initure.Pull=GPIO_PULLUP;                        
                GPIO_Initure.Speed=GPIO_SPEED_FAST;               
                GPIO_Initure.Alternate=GPIO_AF7_USART1;               
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                  


                GPIO_Initure.Pin=GPIO_PIN_10;   
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;               
                GPIO_Initure.Pull=GPIO_PULLUP;                        
                GPIO_Initure.Speed=GPIO_SPEED_FAST;               
                GPIO_Initure.Alternate=GPIO_AF7_USART1;               
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);   


因为这里对机构体变量赋值是相同的,初始化GPIO_PIN_9;   时已经赋值好,不需要再赋值
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;               
                GPIO_Initure.Pull=GPIO_PULLUP;                        
                GPIO_Initure.Speed=GPIO_SPEED_FAST;               
                GPIO_Initure.Alternate=GPIO_AF7_USART1;  



唯一要改变的是GPIO_PIN_10;这是HAL_GPIO_Init(GPIOA,&GPIO_Initure);   初始化函数
所以可以不用
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;               
                GPIO_Initure.Pull=GPIO_PULLUP;                        
                GPIO_Initure.Speed=GPIO_SPEED_FAST;               
                GPIO_Initure.Alternate=GPIO_AF7_USART1;  
只用
GPIO_Initure.Pin=GPIO_PIN_10;                                 
HAL_GPIO_Init(GPIOA,&GPIO_Initure);   
是可以的,


也可以这样写
                GPIO_Initure.Pin=GPIO_PIN_9|GPIO_PIN_10;                        
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;               
                GPIO_Initure.Pull=GPIO_PULLUP;                        
                GPIO_Initure.Speed=GPIO_SPEED_FAST;               
                GPIO_Initure.Alternate=GPIO_AF7_USART1;        
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);   







回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-8-26 18:31:07 | 显示全部楼层
重映射就是将PA9和PA10映射为USART1!HAL库也设置了,GPIO_AF7_USART1这个设置就是重映射为USART1!具体的寄存器设置查看HAL_GPIO_Init()函数!
回复

使用道具 举报

84

主题

555

帖子

0

精华

高级会员

Rank: 4

积分
794
金钱
794
注册时间
2014-9-30
在线时间
135 小时
发表于 2017-8-26 22:51:11 | 显示全部楼层
用 HAL库,建议楼主直接用STM32 CUBEMX

图形化 配置 IO 配置 全搞定。。。
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-7-12
在线时间
26 小时
 楼主| 发表于 2017-8-27 12:39:37 | 显示全部楼层
zuozhongkai 发表于 2017-8-26 18:31
重映射就是将PA9和PA10映射为USART1!HAL库也设置了,GPIO_AF7_USART1这个设置就是重映射为USART1!具体的 ...

这两段代码,都是原子的例程。。我后面自己初始化UART2、3、4的时候 每个IO都做了重映射。工作也是正常的,后来翻看原子的HAL库版本例程,发现部分输入引脚省略了重映射,我查了下HAL_GPIO_Init,没有发现自动匹配功能啊!
在寄存器版本是每位都重映射了!

                GPIO_Initure.Pin=GPIO_PIN_9;                        //PA9
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //&#184;′ó&#195;í&#198;íìê&#228;3&#246;
                GPIO_Initure.Pull=GPIO_PULLUP;                       
                GPIO_Initure.Speed=GPIO_SPEED_FAST;               
                GPIO_Initure.Alternate=GPIO_AF7_USART1;       
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                  

                GPIO_Initure.Pin=GPIO_PIN_10;                       
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                  
这个输入这样设置工作是正常的,是不是HAL库有自动补全?
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-7-12
在线时间
26 小时
 楼主| 发表于 2017-8-27 12:41:14 | 显示全部楼层
caosix 发表于 2017-8-26 22:51
用 HAL库,建议楼主直接用STM32 CUBEMX

图形化 配置 IO 配置 全搞定。。。

我做过一次,不过初接触STM32 还是想多看看代码。。
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-28 17:09:36 | 显示全部楼层
许恒博 发表于 2017-8-27 12:41
我做过一次,不过初接触STM32 还是想多看看代码。。

                GPIO_Initure.Pin=GPIO_PIN_9;                              //PA9
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;           //复用输出模式     
                GPIO_Initure.Pull=GPIO_PULLUP;                         //推挽式输出
                GPIO_Initure.Speed=GPIO_SPEED_FAST;             //输出速度   
                GPIO_Initure.Alternate=GPIO_AF7_USART1;          //这里就是重映射
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //在这函数里初始化

回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-7-12
在线时间
26 小时
 楼主| 发表于 2017-8-29 11:06:21 | 显示全部楼层
huanghan 发表于 2017-8-28 17:09
GPIO_Initure.Pin=GPIO_PIN_9;                              //PA9
                G ...

               GPIO_Initure.Pin=GPIO_PIN_9;                        //PA9
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //&#184;′ó&#195;í&#198;íìê&#228;3&#246;
                GPIO_Initure.Pull=GPIO_PULLUP;                        
                GPIO_Initure.Speed=GPIO_SPEED_FAST;               
                GPIO_Initure.Alternate=GPIO_AF7_USART1;        
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                  

//我想问这里
                GPIO_Initure.Pin=GPIO_PIN_10;       //    接收IO口初始化为什么这么简单?也不用重映射!               
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);      
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-7-12
在线时间
26 小时
 楼主| 发表于 2017-8-29 13:44:43 | 显示全部楼层
huanghan 发表于 2017-8-29 11:41
本来是这样写好看些,                                                                                ...

明白了,谢谢回答。。问了个比较二的问题。结构体里面的变量是设置好的,不需要修改了!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-18 11:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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