STM32CubeMX
关于生成代码就报错的问题
现象如下:
图1
图2
原因:::是因为我的生成路径上有中文字,也就是说 我生成的代码的文件夹名字叫做:STM32CubeMX_流水灯实验;这里面有中文字,所以会报错!!!
只要图1中的Project name这里面不要包含中文字就不会报错!!!
关于用STM32F4刚一生成代码,编译就报错的问题
问题图片:
解决办法:
再次编译即可。
解决后的现象图:
实践1—SysTick
1.在STM32CuBeMX中配置好时钟树,特别注意系统嘀嗒定时器的时钟,选择内部时钟,也就是系统时钟的8分频!(SystemCLK/8)。
在STM32CUBEMX中我们说白了就是只需要配置一个灯的GPIO。因为实验需要用灯来观测闪烁情况。
进入主函数后,我们自己需要写函数:(写关于滴答定时器的延时函数)
static uint16_t fac_us=0;
static uint16_t fac_ms=0;
void delay_us(uint32_t nus)
{
uint32_t temp;
SysTick->LOAD = (nus*fac_us);//时间加载
SysTick->VAL = 0x00;//清空计数器
SysTick->CTRL = 0x01;//开启计数
do
{
temp = SysTick->CTRL;
}while(temp&0x01 && !(temp&(1<<16)));
SysTick->CTRL = 0x00;
SysTick->VAL = 0x00;
}
void delay_ms(uint32_t nms)
{
uint32_t temp;
SysTick->LOAD = (nms*fac_ms);
SysTick->VAL = 0x00;
SysTick->CTRL = 0x01;//开启计数
do
{
temp = SysTick->CTRL;
}while(temp&0x01 && !(temp&(1<<16)));
SysTick->CTRL = 0x00;
SysTick->VAL = 0x00;
}
void delay_init(uint8_t SYSCLK)//其中系统时钟SYSCLK是以MHZ为单位的!
{
fac_us = (SYSCLK/8);
fac_ms = (uint16_t)fac_us*1000;
}
然后我们在值函数中调用即可:
delay_init(72);
while (1)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
delay_ms(500);
}
以上就是配置系统滴答定时器!
实践2—基本定时器
首先也是关于基本定时器的配置,这里选用了基本定时器6,其他的定时器一样的配置。
这里的预分频选择了,7199,也就是选择了计数一次的频率是:72MHZ/(7199+1)==10KHZ。
然后技术周期选择了4999,即(4999+1)/10000=0.5s产生一次中断。
计数模式选择了向上计数,不需要自动重装载。然后弄完这之后,在System Core中勾选TIM6 global interrupt这个选项。
其他的RCC SYS都是以前设置的那样设置。
然后生成代码。
进入主函数中,只有配置了MX_GPIO_Init()和MX_TIM6_Init()。第一个函数主要是配置灯的GPIO,第二个函数是关于基本定时器的配置。
打开第二个文件发现,把GPIO和中断都配置了。
TIM_HandleTypeDef htim6;
/* TIM6 init function */
void MX_TIM6_Init(void)
{
/* USER CODE BEGIN TIM6_Init 0 */
/* USER CODE END TIM6_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM6_Init 1 */
/* USER CODE END TIM6_Init 1 */
htim6.Instance = TIM6;
htim6.Init.Prescaler = 7199;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = 4999;
htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM6_Init 2 */
/* USER CODE END TIM6_Init 2 */
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM6)
{
/* USER CODE BEGIN TIM6_MspInit 0 */
/* USER CODE END TIM6_MspInit 0 */
/* TIM6 clock enable */
__HAL_RCC_TIM6_CLK_ENABLE();
/* TIM6 interrupt Init */
HAL_NVIC_SetPriority(TIM6_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM6_IRQn);
/* USER CODE BEGIN TIM6_MspInit 1 */
HAL_TIM_Base_Start_IT(&htim6);
/* USER CODE END TIM6_MspInit 1 */
}
}
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM6)
{
/* USER CODE BEGIN TIM6_MspDeInit 0 */
/* USER CODE END TIM6_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM6_CLK_DISABLE();
/* TIM6 interrupt Deinit */
HAL_NVIC_DisableIRQ(TIM6_IRQn);
/* USER CODE BEGIN TIM6_MspDeInit 1 */
/* USER CODE END TIM6_MspDeInit 1 */
}
}
注意,这里面的HAL_TIM_Base_Start_IT(&htim6);需要自己配置写上去!!!不能忘!!!我就是这里出了问题!
所以我们只需要去到终端服务函数中找到相应的中断:TIM6_IRQn的中断服务函数。
找到 HAL_TIM_IRQHandler(&htim6);并按F12,进入公共中断服务函数void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim),然后在这个公共中断服务函数中,找到 HAL_TIM_PeriodElapsedCallback(htim);再对他按F12,我们会找到一个——WEAK开头的函数,这个就是们需要的终端服务回调函数!复制它,到main()中,进行如下代码配置:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM6)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
}
}
以上就是配置基本定时器定时的代码。