打开主菜单

谷雨文档中心 β

更改

NBDK-L4:基础实验教程

添加1,439字节2019年2月21日 (四) 10:31
stm32l4xx_hal_conf.h
==== stm32l4xx_hal_conf.h ====
此文件位于“实验16此文件位于“实验17-RTC实时时钟定时器中断\Inc”路径中,主要用途是选择使能此例程使用到的库文件。
此例程我们主要给大家展示STM32L4的定时器的中断功能,所以我们宏定义中打开TIM相关的。<syntaxhighlight lang="c" line="1" start="103">
==== stm32l4xx_hal_conf.h ====
此文件位于“实验16此文件位于“实验18-RTC实时时钟独立看门狗\Inc”路径中,主要用途是选择使能此例程使用到的库文件。
此例程我们主要给大家展示STM32L4的独立看门狗功能,所以我们宏定义中打开IWDG相关的。<syntaxhighlight lang="c" line="1" start="103">
==== stm32l4xx_hal_conf.h ====
此文件位于“实验16此文件位于“实验19-RTC实时时钟窗口看门狗\Inc”路径中,主要用途是选择使能此例程使用到的库文件。
此例程我们主要给大家展示STM32L4的窗口看门狗功能,所以我们宏定义中打开WWDG相关的。<syntaxhighlight lang="c" line="1" start="103">
==== stm32l4xx_hal_conf.h ====
此文件位于“实验16此文件位于“实验20-RTC实时时钟外部Flash\Inc”路径中,主要用途是选择使能此例程使用到的库文件。
此例程我们主要给大家展示STM32L4的窗口看门狗功能,所以我们宏定义中打开WWDG相关的。此例程我们主要给大家展示STM32L4通过SPI接口向外部flash读写数据的功能,所以我们宏定义中打开SPI相关的。<syntaxhighlight lang="c" line="1" start="103">
// 使能的宏
#define HAL_MODULE_ENABLED // 芯片
#define HAL_UART_MODULE_ENABLED // UART
#define HAL_SPI_MODULE_ENABLED // SPI
#define HAL_WWDG_MODULE_ENABLED // 窗口看门狗
</syntaxhighlight>
main函数,我们的例程由此处开始执行,首先调用HAL_Init()函数初始化我们的模块,接着调用SystemClock_Config()函数初始化此例程用到的时钟,具体有哪些时钟被初始化,在gyu_util.c部分有详细说明。
接下来我们初始化了LED,设置LED点亮,在LED点亮之前我们延时500ms,用来展示程序是否被窗口看门狗重启。接下来我们分别初始化了串口和按键,用于辅助展示此例程的实验现象。
最后我们初始化窗口看门狗。最后我们初始化了SPI接口,用于与外部flash通信,读写flash中的数据。
<syntaxhighlight lang="c++" line="1" start="32">
HAL_Init();
// 配置系统时钟(包含振荡器、系统时钟、总线时钟等等)
SystemClock_Config();
// 初始化LED引脚
LED_Init();
// 初始化USART1 MX_USART1_UART_Init(); // 延时500ms,展示软件是否重启(重启则LED闪烁,不重启则LED常亮)初始化按键引脚 HAL_Delay MX_KEY_Init(500); LED_SET //注册按钮回调函数 KEY_RegisterCb(GPIO_PIN_SETAppKey_cb);
// 初始化窗口看门狗SPI初始化 MX_WWDG_InitSpi_Init();
//
while (1)
{
KEY_Poll(); // 按键轮训,监测是否有按键被按下
}
}
基础实验中的其他例程,大部分都是使用的相同的时钟配置函数,有特殊的时钟使用,将会在对应例程的源码详解中做针对性说明。
==== gyu_iwdggyu_spi.c ====窗口看门狗初始化函数,初始化窗口看门狗时钟8分频(时钟来源PCLK1 80MHz),配置上窗口值0x50,下窗口值默认0x40,并且使能唤醒中断(可以在唤醒中断中喂狗)。
利用窗口看门狗的喂狗时间计算公式,我们分别得到上下窗口值的时间: 上窗口(0x50):33.17ms 下窗口(0x40):26.21ms <syntaxhighlight lang="c++" line="1" start="4635">void MX_WWDG_InitMX_SPI1_Init(void)
{
hwwdghspi1.Instance = WWDGSPI1; // 配置为WWDG配置为SPI1 hwwdghspi1.Init.Prescaler Mode = WWDG_PRESCALER_8SPI_MODE_MASTER; // 8分频,WDGTB 配置SPI1主模式 hspi1.Init.Direction = 3SPI_DIRECTION_2LINES; hwwdghspi1.Init.Window DataSize = 0x50SPI_DATASIZE_8BIT; // 上窗口值为0x50配置数据大小为8bit hwwdghspi1.Init.Counter CLKPolarity = 0x7FSPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; // NSS由软件控制 hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; // 计数CNT为0x7F(最大值)配置数据MSB(高位在前) hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; // 禁能CRC hspi1.Init.CRCPolynomial = 7; hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; hwwdghspi1.Init.EWIMode NSSPMode = WWDG_EWI_ENABLESPI_NSS_PULSE_ENABLE; // 使能唤醒中断初始化SPI1,如果出错则进入错误处理程序 if (HAL_WWDG_InitHAL_SPI_Init(&hwwdghspi1) != HAL_OK) // 初始化WWDG,出错则进入错误处理函数
{
_Error_Handler(__FILE__, __LINE__);
}
}
</syntaxhighlight>窗口看门狗初始化,使能窗口看门狗时钟,使能中断。<syntaxhighlight lang="c++" line="1" start="6766">void HAL_WWDG_MspInitHAL_SPI_MspInit(WWDG_HandleTypeDef SPI_HandleTypeDef*hwwdghspi){ // 定义GPIO结构体 GPIO_InitTypeDef GPIO_InitStruct; if(hspi->Instance==SPI1) { // 使能SPI1时钟 __HAL_RCC_SPI1_CLK_ENABLE(); // 配置SPI1引脚 //PA5 ------> SPI1_SCK //PA6 ------> SPI1_MISO //PA7 ------> SPI1_MOSI GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; // 配置SPI1引脚 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // 高速模式 GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; // 用做SPI1 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化引脚 }</syntaxhighlight><syntaxhighlight lang="c++" line="1" start="96">void SPI_CSN_Init(void)
{
__HAL_RCC_WWDG_CLK_ENABLE GPIO_InitTypeDef GPIO_InitStructure; // 定义引脚参数结构体  __HAL_RCC_GPIOA_CLK_ENABLE(); //使能窗口看门狗时钟使能GPIOA时钟 __HAL_RCC_GPIOB_CLK_ENABLE();
HAL_NVIC_SetPriority GPIO_InitStructure.Pin= GPIO_PIN_12; // 引脚编号为15 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; // 低频率 GPIO_InitStructure.Pull = GPIO_PULLUP; // 上拉 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化PA15 HAL_GPIO_WritePin(WWDG_IRQnGPIOB, 10GPIO_PIN_12, 0GPIO_PIN_SET); //设置PA15默认输出低电平}</抢占优先级10,子优先级为0syntaxhighlight><syntaxhighlight lang="c++" line="1" start="120">void SPI_CSN_Ctr(GPIO_PinState pinSate){ HAL_NVIC_EnableIRQ HAL_GPIO_WritePin(WWDG_IRQnGPIOB, GPIO_PIN_12, pinSate); //使能窗口看门狗中断设置PA15输出
}
</syntaxhighlight>窗口看门狗唤醒中断回调函数,我们可以在这个函数中去调用喂狗的函数。<syntaxhighlight lang="c++" line="1" start="83139">void HAL_WWDG_EarlyWakeupCallbackSpi_Init(WWDG_HandleTypeDef* hwwdgvoid){ HAL_WWDG_Refresh// 初始化CSN引脚 SPI_CSN_Init(hwwdg); // 喂狗初始化SPI1接口 MX_SPI1_Init();
}
</syntaxhighlight>
510
个编辑