请选择 进入手机版 | 继续访问电脑版

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

【经验分享】使用STM32G4 ----点亮LED

[复制链接]
STMCU小助手 发布时间:2021-12-8 22:00
1.使用keil5的注意事项
用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。
  1. /* USER CODE BEGIN 1 */     //代码开始

  2. /* USER CODE END 1 */                //代码结束
复制代码

2.HAL库延时函数
1、HAL库自带延时函数(毫秒,阻塞)
  1. HAL_Delay(x);
  2. 实际延时时间为(x+1)ms
复制代码

HAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。

2、重新定义延时函数,非阻塞式延时
  1. void Delay_us(int16_t nus)
  2. {
  3.   int32_t temp;
  4.   SysTick->LOAD = nus*9; //72MHz
  5.   SysTick->VAL=0X00;
  6.   SysTick->CTRL=0X01;
  7.   do
  8.   {
  9.     temp=SysTick->CTRL;
  10.   }
  11.   while((temp&0x01)&&(!(temp&(1<<16))));

  12.   SysTick->CTRL=0x00;
  13.   SysTick->VAL =0X00;
  14. }
复制代码

3.HAL库配置GPIO
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码

解释:

HAL_GPIO_Init
初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码

HAL_GPIO_DeInit
将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码

HAL_GPIO_ReadPin
读取我们想要知道的引脚的电平状态、函数返回值为0或1。
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码

HAL_GPIO_WritePin
给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码

HAL_GPIO_TogglePin
翻转某个引脚的电平状态
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码

HAL_GPIO_LockPin
如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  2. 例:
  3. HAL_StatusTypeDef hal_State;
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);

复制代码

HAL_GPIO_EXTI_IRQHandler
这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码

HAL_GPIO_EXTI_Callback
中断回调函数,可以理解为中断函数具体要响应的动作。
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码


4.LED工程
1.LED电路原理图

20210424110119129.png


2.GPIO_PIN_SET与GPIO_PIN_RESET

  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
  2. {
  3.   /* Check the parameters */
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));

  6.   if (PinState != GPIO_PIN_RESET)
  7.   {
  8.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin
  9.   }
  10.   else
  11.   {
  12.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin
  13.   }
  14. }
复制代码

例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;

例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;

3.锁存器
锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。

LE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;
当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;
当OE为低电平时,8个锁存器的内容在输出端可用;
当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。
4.用端口输出控制函数控制LED闪烁

  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭
  2.         HAL_Delay(300);
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        
  4.         HAL_Delay(300);
复制代码

5.用端口输出翻转函数控制LED闪烁
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数
  2.         HAL_Delay(300);
复制代码

6.使用锁存器
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数
  3.     HAL_Delay(300);
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码

7.LED跑马灯

  1. #define DELAY_TIME        100
  2. void LED_test(void)
  3. {
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
  7.                 HAL_Delay(DELAY_TIME);
  8.                
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
  12.                 HAL_Delay(DELAY_TIME);
  13.                
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
  17.                 HAL_Delay(DELAY_TIME);
  18.                
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
  22.                 HAL_Delay(DELAY_TIME);
  23.                
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
  27.                 HAL_Delay(DELAY_TIME);
  28.                
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
  32.                 HAL_Delay(DELAY_TIME);
  33.                
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
  37.                 HAL_Delay(DELAY_TIME);
  38.                
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
  42.                 HAL_Delay(DELAY_TIME);        
  43. }

复制代码


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

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版