你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F7 IO输出

[复制链接]
STMCU小助手 发布时间:2021-12-12 21:00
1. STM32F7 IO资源:
九组IO:x=A/B/C/D/E/F/G/H/I
可实现八种模式:
输入浮空
输入上拉
输入下拉
模拟输入
开漏输出
推挽输出
推挽式复用功能
开漏式复用功能
2. 初始化相关寄存器:
MODER:控制GPIO端口工作模式

20161026103537295.png


默认为输入模式


OTYPER:控制输出类型

20161026144229926.png


推挽输出:可以直接用于驱动负载电路,无电阻分压
输出开漏:不输出电压,低电平接地,高电平不接地,无法输出高电平


OSPEEDR:控制GPIOx的输出速度

20161026152503420.png


PUPDR:控制GPIOx的上拉/下拉

20161026152602965.png


关于上下拉的设定,左边为上拉及输出一时为低电平,输出0时为高电平,下拉反之。图为上拉输出,输出高电平时,则开关闭合

20161101212836650.jpg


初始化方法:
配置相关的结构体并调用以下函数:
  1.         typedef struct {
  2.         uint32_t Pin; //指定IO口
  3.         uint32_t Mode;//模式设置
  4.         uint32_t Pull;//上下拉设置
  5.         uint32_t Speed;//速度设置
  6.         uint32_t Alternate;//复用映射配置
  7.         }GPIO_InitTypeDef;
  8.         void HAL_GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef *GPIO_Init);
  9.     //例子:
  10.     GPIO_InitTypeDef GPIO_Initure;
  11.     GPIO_Initure.Pin=GPIO_PIN_0; //PB0 GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
  12.     HAL_GPIO_Init(GPIOB,&GPIO_Initure);
复制代码

上面代码的意思是设置 PB0 端口为推挽输出模式,输出速度为高速,上拉。

3. 实现IO口输出的控制
相关寄存器:
ODR寄存器:

20161026155959230.png


1为高电平,0为低电平
BSRR寄存器:

20161026160223971.png


对于低16位(0-15),我们往相应的位写1,那么对应的IO口会输出高电平,往相应的位写0, 对 IO 口没有任何影响。高 16 位(16-31)作用刚好相反,对相应的位写 1 会输出低电平,写 0 没有任何影响。也就是说,对于 BSRR 寄存器,你写 0 的话,对 IO 口电平是没有任何影响的。 我们要设置某个 IO 口电平,只需要相关位设置为 1 即可。而 ODR 寄存器,我们要设置某个 IO 口电平,我们首先需要读出来 ODR 寄存器的值,然后对整个 ODR 寄存器重新赋值来达到设置
某个或者某些 IO 口的目的,而 BSRR 寄存器,我们就不需要先读,而是直接设置即可,这在 多任务实时操作系统中作用很大。


设置方法如下:
  1.          GPIOA->BSRR=1<<1; //设置 GPIOA.1 为高电平
  2.          GPIOA->BSRR=1<<(16+1)//设置 GPIOA.1 为低电平
  3.          //使用函数来进行操作:
  4.          void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin, GPIO_PinState PinState);
  5.          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET); //GPIOB.5输出高
  6.          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_RESET); //GPIOB.5 输出低
复制代码

通过以上方法配合时延函数,能够实现IO端口的数据输出

IDR寄存器:

20161026162805634.png
该寄存器用于读取IO的电平,1为高电平,2为低电平

  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  2. //例子
  3. HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_5);//读取 PF5 的输入电平
复制代码

操作步骤:
使能 IO 口时钟,调用函数为__HAL_RCC_GPIOX_CLK_ENABLE(其中 X=A~K)。
初始化 IO 参数。调用函数 HAL_GPIO_Init();
操作 IO 输入输出。操作 IO 的方法就是上面讲解的方法。
  1. //例子
  2. //初始化 PB1 为输出.并使能时钟
  3. //LED IO 初始化
  4. void LED_Init(void)
  5. {
  6.     GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOB_CLK_ENABLE();
  7. //开启 GPIOB 时钟
  8.     GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //PB1,0
  9.     GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
  10.     GPIO_Initure.Pull=GPIO_PULLUP; //上拉
  11.     GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
  12.     HAL_GPIO_Init(GPIOB,&GPIO_Initure);
  13.     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //PB0 置 1 ,默认灯灭
  14.     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //PB1 置 1 ,默认灯灭
  15. }
  16. //在循环函数添加以下内容实现IO口交替输出:
  17. while(1)
  18. {
  19.     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
  20. //LED0 对应引脚 PB1 拉低,亮,等同于 LED0(0)
  21.     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
  22. //LED1 对应引脚 PB0 拉高,灭,等同于 LED1(1)
  23.     delay_ms(500); //延时 500ms HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
  24. //LED0 对应引脚 PB1 拉高,灭,等同于 LED0(1)
  25.     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
  26. //LED1 对应引脚 PB0 拉低,亮,等同于 LED1(0)
  27.     delay_ms(500); //延时 500ms
  28. <span style="color: rgb(79, 79, 79); font-family: &quot;Source Code Pro&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Ubuntu Mono&quot;, &quot;Anonymous Pro&quot;, &quot;Droid Sans Mono&quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, sans-serif; font-variant-ligatures: no-common-ligatures; white-space: pre; background-color: rgb(246, 248, 250);">}</span>
复制代码



收藏 评论0 发布时间:2021-12-12 21:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版