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

STM32基础设计---点亮LED灯

[复制链接]
STMCU小助手 发布时间:2023-1-5 21:17
首先,总结全文,用STM32f103c8点亮LED的大概步骤为:
1.定义GPIO口结构体
2.使能相关gpio口的时钟
3.如果GPIO口有其他重映射功能,先失能其重映射。
4.操纵相应GPIO口,实现LED灯的亮灭。
下面详细解释具体步骤:

1,定义GPIO口
库函数中GPIO结构体:
  1. typedef struct
  2. {
  3.   uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
  4.                                       This parameter can be any value of @ref GPIO_pins_define */

  5.   GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
  6.                                       This parameter can be a value of @ref GPIOSpeed_TypeDef */

  7.   GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
  8.                                       This parameter can be a value of @ref GPIOMode_TypeDef */
  9. }GPIO_InitTypeDef;
复制代码

根据库函数,博主是这样定义的:

  1. GPIO_InitTypeDef B_IO;
复制代码


根据此结构体就可以明确使用GPIOx口的某个引脚,引脚的最大速率以及引脚的使用模式。

模式分别有:模拟输入模式,浮空输入模式(复位口的状态)、上拉/下拉输入模式、通用推挽输出模式、通用开漏输出模式、复用功能推挽输出模式、复用功能开漏输出模式。

速率可根据相应要求,设置为10Mhz、2Mhz、50Mhz。

接下来给GPIO口赋值:

  1. B_IO.GPIO_Pin = GPIO_Pin_3;
  2. B_IO.GPIO_Speed = GPIO_Speed_50MHz;
  3. B_IO.GPIO_Mode = GPIO_Mode_Out_PP;//此为推挽输出
  4. GPIO_Init(GPIOB,&B_IO);//通过GPIO_Init()函数初始化GPIO口。
复制代码

2.使能相关gpio口的时钟

函数库中相关的函数为:

  1. void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
复制代码

详细内容请自查。

博主用的STM32板子上GPIOB的第3引脚连接了LED灯,但是根据STM32中文手册,这个引脚重映射了,所以要关闭其重映射,才可以用GPIOB_Pin_3引脚。

2018031719363616.png

调整引脚映射需要用到这个库函数:

  1. void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
复制代码

另外,对寄存器AFIO_MAPR,AFIO_EXTICRX和AFIO_EVCR进行读写操作前,应当首先打开AFIO时钟。
AFIO_MAPR:配置复用功能重映射

AFIO_EXTICRX:配置外部中断线映射

AFIO_EVCR: 配置EVENTOUT事件输出

  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);       
  2. GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
  3. GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
复制代码

4.控制引脚信号,实现LED灯的亮灭
定义了GPIO口变量,又使能了时钟,这样相关引脚就可以直接控制了。

  1. delay(1000);
  2. GPIOB->BSRR = GPIO_Pin_3;//Pin_3置1
  3. delay(1000);
  4. GPIOB->BRR = GPIO_Pin_3;//置0
  5. delay(1000);
  6. GPIOB->BSRR = GPIO_Pin_3;
复制代码

可以通过GPIO寄存器BRR、BSRR来设置相关引脚的信号。

简单地说:

对于低16位而言,BRR是用来置0的,BSRR是用来置1的。

对于高16位而言,BRR的高16位保留,BSRR的高16位是用来置0的。

具体的请自查STM32中文手册115页。

因为PB3引脚接着一个电源,故PB3为低电平时灯亮,高电平时灯灭。

详细代码如下:
  1. #include<stm32f10x.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. void delay(uint n)
  5. {
  6.         int i,j;
  7.         for(i=0;i<n;i++)
  8.                 for(j=0;j<8500 ; j++);
  9. }
  10. int main(void)
  11. {
  12.         GPIO_InitTypeDef B_IO;
  13.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  15.        
  16.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
  17.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

  18.        
  19.         B_IO.GPIO_Pin = GPIO_Pin_3;
  20.         B_IO.GPIO_Speed = GPIO_Speed_50MHz;
  21.         B_IO.GPIO_Mode = GPIO_Mode_Out_PP;
  22.         GPIO_Init(GPIOB,&B_IO);
  23.        
  24.         GPIOB->BRR=GPIO_Pin_3;
  25.         while(1)
  26.         {
  27.                 delay(1000);
  28.                 GPIOB->BSRR = GPIO_Pin_3;
  29.                 delay(1000);
  30.                 GPIOB->BRR = GPIO_Pin_3;
  31.                 delay(1000);
  32.                 GPIOB->BSRR = GPIO_Pin_3;
  33.         }
  34. }
复制代码

————————————————
版权声明:家安


收藏 评论0 发布时间:2023-1-5 21:17

举报

0个回答

所属标签

相似分享

官网相关资源

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