STM32F103个人学习基础篇(1)

STM32F103个人学习基础篇(1)

  • 流水灯程序的写法与详解
  • 按键程序的写法与详解

流水灯程序的写法与详解

要制作一个流水灯程序,首先应该配置野火板上相对应的引脚PG12~15(因为每个板子都不同还是得找到板子所对应的原理图在进行配置),将他们选为输出类型,在选择configuration项进行PG12~15的配置(例如输出高低电平,模式,速度的配置和用户标签的写入)

STM32F103个人学习基础篇(1)_第1张图片

STM32F103个人学习基础篇(1)_第2张图片

其次就是用户代码的写入,制作流水灯只需要用到两个.c文件,一个是main.c文件,另一个就是stm32f1XX-hal-gpio.c文件。
打开stm32f1XX-hal-gpio.c文件找到翻转函数(翻转函数就是将参数中对应的GPIO引脚不断的来回置1和置0)

/**
  * @brief  Toggles the specified GPIO pin
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral 
  * @param  GPIO_Pin: Specifies the pins to be toggled.
  * @retval None
  */
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));

  GPIOx->ODR ^= GPIO_Pin;
}

接下来打开main.c文件找到while循环(while(1)是一个死循环在里面的函数会不断的被调用和执行),因为要达到流水灯的效果所以还要添加一个HAL_Delay函数,而这个函数内的参数则是延迟的毫秒数(由个人定最好是几百毫秒这样效果比较明显)

while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
        HAL_GPIO_TogglePin(GPIOG,LED1_Pin);
    HAL_Delay(100);
        HAL_GPIO_TogglePin(GPIOG,LED2_Pin);
    HAL_Delay(300);
        HAL_GPIO_TogglePin(GPIOG,LED3_Pin);
    HAL_Delay(500);
        HAL_GPIO_TogglePin(GPIOG,LED4_Pin);
    HAL_Delay(700);

  }
  /* USER CODE END 3 */

}

程序写完之后进行编译然后下载到板子上查看流水灯效果

按键程序的写法与详解

要制作一个按键程序,首先应该配置野火板上相对应的引脚PF8~PF11,将他们设置为输入类型,再选择configuration项进行PF8~PF11的配置(其中在上拉和下拉电阻选择是选择上拉电阻),为了更直观的看到按键的效果,我们这里做的是按键按下熄灭led灯的程序

STM32F103个人学习基础篇(1)_第3张图片

STM32F103个人学习基础篇(1)_第4张图片

uint16_t  key_dn=0;(全局变量)
void HAL_SYSTICK_Callback(void)//滴答定时器的回调函数
{
  static uint16_t key_o=0x0f00;//PF8~11,老按键状态key_o=0000111100000000
  uint16_t key_n=0;//新按键状态
  static uint8_t b=0;//静态检测按键变量 
  if(++b>=20)
  {
    if(HAL_GPIO_ReadPin(GPIOF,k1_Pin))
      key_n|=k1_Pin;
    if(HAL_GPIO_ReadPin(GPIOF,k2_Pin))
      key_n|=k2_Pin;
    if(HAL_GPIO_ReadPin(GPIOF,k3_Pin))
      key_n|=k3_Pin;
    if(HAL_GPIO_ReadPin(GPIOF,k4_Pin))
      key_n|=k4_Pin;
     key_dn=(key_n^key_o)&key_o;//当按键按下key_o为0x0000是key_dn按键被按下的那位就会被赋值为1
     key_o=key_n;
     b=0;
  }
 }

再main.c中找到while(1)循环, 在其中写上按键按下的判断语句以及按键按下后led的变化控制函数

 while (1)
  {
        if(key_dn)
        {
            if(key_dn&k1_Pin)
            {
                HAL_GPIO_WritePin(GPIOG,led1_Pin,GPIO_PIN_SET);
            }
                if(key_dn&k2_Pin)
            {
                HAL_GPIO_WritePin(GPIOG,led2_Pin,GPIO_PIN_SET);
            }
                if(key_dn&k3_Pin)
            {
                HAL_GPIO_WritePin(GPIOG,led3_Pin,GPIO_PIN_SET);
            }
                if(key_dn&k4_Pin)
            {
                HAL_GPIO_WritePin(GPIOG,led4_Pin,GPIO_PIN_SET);
            }
        }
}

写完函数之后编译下载看到的效果应该是,刚开始led灯是全亮状态,当对应按键按下后led灯也会熄灭

你可能感兴趣的:(stm32f103,stm32)