由于我已经是从STM32F4过来的老鸟了,现在学STM32H7不再需要一步一步的学起,就是原先使用的是标准库现在需要熟悉HAL库的使用。
我将部分基础例程直接合并到一起,在自己新建的工程里面实现了这些功能:
当然 还是想吐槽一下正点原子的代码格式真是乱的一塌糊涂, 做项目还是要像安富莱那样写代码,等你工作了你就会知道,好的代码可以提高工作效率。建议大家读一读《代码的整洁之道》,好我们接下来开始讲解工程:
1.初始化流程
void Init_Pro(void)
{
/* 使能L1 Cache */
CPU_CACHE_Enable();
HAL_Init();
SystemClock_Config();
delay_init(400);
LED_Init();
Beep_Init();
KEY_Init();
// Exti_Init();
Uart_Init(115200);
printf("Power On\r\n");
// IWDG_Init(IWDG_PRESCALER_64,500);
// WWDG_Init(0X7F,0X5F,WWDG_PRESCALER_8);
// Timer_Init(5000-1,20000-1);
PWM_Init(500-1,200-1);//200M/200=1M的计数频率,自动重装载为500,那么PWM频率为1M/500=2kHZ
PWM_Capture_Init();
SDRAM_Init();
LCD_Init(); //初始化LCD
}
下面介绍一下:
* CPU_CACHE_Enable();
使能指令缓存和数据缓存,使用过ARM9的同事应该用过,加了这条指令后,执行速度飞快,但有时也会存在问题需要清空缓存等,或者立即同步缓存,来防止错误,有经验的朋友这里可以补充一下具体情况
* HAL_Init
这里其实有用的就是初始化定时器滴答,这样在后续就可以使用HAL_Delay这个延迟函数
*SystemClock_Config
这个是重点,设置时钟,HAL库不像标准库,标准库是把时钟设置放到system_stm32h7xx.c文件里面初始化的,也就是在进入main函数之前时钟就配置好了,HAL先以内部时钟配置,然后调用SystemClock_Config实现用户的时钟配置
/**
* @brief System Clock Configuration
* The system Clock is configured as follow :
* System Clock source = PLL (HSE BYPASS)
* SYSCLK(Hz) = 400000000 (CPU Clock)
* HCLK(Hz) = 200000000 (AXI and AHBs Clock)
* AHB Prescaler = 2
* D1 APB3 Prescaler = 2 (APB3 Clock 100MHz)
* D2 APB1 Prescaler = 2 (APB1 Clock 100MHz)
* D2 APB2 Prescaler = 2 (APB2 Clock 100MHz)
* D3 APB4 Prescaler = 2 (APB4 Clock 100MHz)
* HSE Frequency(Hz) = 25000000
* PLL_M = 5
* PLL_N = 160
* PLL_P = 2
* PLL_Q = 2
* PLL_R = 2
* VDD(V) = 3.3
* Flash Latency(WS) = 4
* @param None
* @retval None
*/
我们可以通过CubeMX学习一下时钟如何配置的:
SYSCLK = HSE/ PLL_M*PLL_N/PLL_P
400 = 25 / 5 *160 /2
我们知道这里就行了,后续深入学习时钟的时候,再讲解。这里要注意,学的时候可以循序渐进,先学个浅显的东西,这是很好的。但是,很多人特别是一部分硬件工程师,看到CubeMX这么好用,就靠着CubeMX来写代码,我们真正要做到的是学习其原理,要去读手册尤其是英文手册,别人是硬件工程师,只要能用就行了,我们是软件工程师,要做到的是出了问题,能够解决,很多时候你明明配置对了,仍然会遇到问题。
接下来很简单 就是开始初始化自己的外设:
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //PB0,1
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
HAL_GPIO_Init(GPIOB,&GPIO_Initure); //初始化GPIOB.0和GPIOB.1
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //PB0置0
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //PB1置1
IO口的操作 无非就是: 按键做输入,开关控制做输出,AD采样做模拟,复用功能:串口/SPI/I2C/USB等等, 上下拉开漏/推挽根据外围电路需要设置。老掉牙的东西,也不想多说了,这里直接上传工程文件,里面包含了基础例程
https://download.csdn.net/download/liangwu5582066930/13073895