Bootstrap

基于RM开发板32学习日记

环境配置

芯片选型 STM32F407IGH6

配置时钟 12 168

模块 Led

引脚选择  比对原理图 可查看

设置为Out_Put输出 三色同时点亮 合为白色光

 HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET);
 HAL_GPIO_WritePin(GPIOH, GPIO_PIN_10, GPIO_PIN_SET);
 GPIOH->ODR=0xffff       //需要配置 10 11 12引脚 清除该位的高字节 1111 1111 1000 1111
 所表达效果相同 拉高同时为1 

HAL_GPIO_WritePin写入电平函数

引脚电平设定

1.ODR 修改全针脚 电平
2.BSRR 修改单一针脚电平为高或低
GPIOD BSRR = (1<<2); 改为高电平
GPIOD BSRR = (1<<(2+16)); 改为低电平


3.BRR 修改单一针脚电平为低
HAL_GetTick()延时函数

HAL_GPIO_TogglePin函数: 翻转电平

Led封装

根据该板 简单封装了Led点亮装置不同位置打入数字,完成不同颜色点亮

#include "led_app.h"

uint8_t ucled[3]={1,0,0};
void disp_led(void)
{		
			uint8_t i;
		 GPIOH->ODR=0xE3ff; //关闭灯光//红0绿1蓝2
			for(i=0;i<3;i++)
		{
			if(ucled[i]>0)
			{GPIOH->ODR+=(1<<(12-i));}
		}	
}

void led_proc(void)
{
		disp_led();
		HAL_Delay(200); 
		GPIOH->ODR=0xE3ff;
		
}





KEY模块

HAL_GPIO_ReadPin函数 :读取电平

中断函数 

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == KEY_Pin)
    {
        if(exit_flag == 0)
        {
            exit_flag = 1;
            rising_falling_flag = HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin);
        }
    }
}

        if(exit_flag == 1)
        {
            exit_flag = 2;
            if(rising_falling_flag == GPIO_PIN_RESET)
            {
                //debouce
                //消抖
                HAL_Delay(20);
                if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET)
                {
                    HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_SET);
                    exit_flag = 0;
                }
                else
                {
                    exit_flag = 0;
                }
            }
            else if(rising_falling_flag == GPIO_PIN_SET)
            {
                //debouce
                //消抖
                HAL_Delay(20);
                if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_SET)
                {
                    HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_RESET);
                    exit_flag = 0;
                }
                else
                {
                    exit_flag = 0;
                }
            }
#include "key_app.h"


uint8_t exit_flag=0;
uint8_t key_val = 0;  // 当前按键状态
uint8_t key_old = 0;  // 前一按键状态
uint8_t key_down = 0; // 按下的按键
uint8_t key_up=0;


uint8_t key_read(void) 
{
	
    // 检查 GPIOB 引脚 0 的状态
	uint8_t temp=0;
    if(HAL_GPIO_ReadPin(key_GPIO_Port, key_Pin) == GPIO_PIN_RESET) {
        temp=1; // 如果引脚状态为 RESET,则按键 1 被按下
    }
    return temp; // 否则没有按键按下
}


// 按键处理函数
void key_proc(void) 
	{
    key_val = key_read();
    key_down = key_val & (key_old ^ key_val);
		key_up = ~key_val & (key_old ^ key_val);
    key_old = key_val;
		
		if(key_down){GPIOH->ODR=0xE3ff;}
		if(key_up){led_proc();}
	}
	
	
	
	
	void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == key_Pin)
    {
       key_proc();
    }
}

HAL_TIM_IRQHandler 定时器中断函数

HAL_TIM_Base_Start 定时器开启 

只开启

 HAL_TIM_Base_Start_IT 定时器触发中断




专业名词总结

;