③、Nucleo-64板卡的基础分析与使用
建立完工程,接下来的任务当然是点亮一个LED灯了,Nucleo板卡中自带一个与stm32f410 IO口相连的一个发光二极管。
如图所示,通过观察原理图,可以看出SB20,SB24,SB29是断开的,也就是说发光二极管与PA5相连,当PA5输出高电平的时候,发光二极管会亮;
在APP分组内添加一个LED.C和LED.H文件用于做点亮LED的功能,查看库函数里的源代码,可以得知配置GPIO的基本具体操作如下:
以下是宏定义:
在main.c包含该.h文件,在while里直接调用led_on;就行了
实验结果如下:
④、100MHZ
在Nucleo板卡的包装上,可以得知,STM32F410是可以达到100MHZ的,因此可以用其内部晶振让其达到100MHZ,并且用滴答定时器写一个微妙级以及毫秒级的延时。
废话不多说,先呈上源代码
/**
* @brief System Clock Configuration
* The system Clock is configured as follow :
* System Clock source = PLL (HSI)
* SYSCLK(Hz) = 100000000
* HCLK(Hz) = 100000000
* AHB Prescaler = 1
* APB1 Prescaler = 2
* APB2 Prescaler = 1
* HSI Frequency(Hz) = 16000000
* PLL_M = 16
* PLL_N = 200
* PLL_P = 2
* PLL_Q = 15
* PLL_R = 7
* VDD(V) = 3.3
* Main regulator output voltage = Scale1 mode
* Flash Latency(WS) = 5
* @param None
* @retval None
*/
static void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;
/* Enable Power Control clock */
__HAL_RCC_PWR_CLK_ENABLE();
/* The voltage scaling allows optimizing the power consumption when the device is
clocked below the maximum system frequency, to update the voltage scaling value
regarding system frequency refer to product datasheet. */
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/* Enable HSI Oscillator and activate PLL with HSI as source */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 0x10;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 16;
RCC_OscInitStruct.PLL.PLLN = 200; //倍频系数
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; //2
RCC_OscInitStruct.PLL.PLLQ = 15;
RCC_OscInitStruct.PLL.PLLR = 7;
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
clocks dividers */
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief This function is executed in case of error occurrence.
* @param None
* @retval None
*/
static void Error_Handler(void)
{
/* User may add here some code to deal with this error */
while(1)
{
}
}
使用时,只需调用SystemClock_Config函数即可,该代码是在ST官方HAL库给的例程里复制的,因此有了官方例程,还要什么自行车!
当然,还要通过F410的官方数据手册进行分析:
不妨带入芯片使用手册的公式算一下
在程序中,启用了PLLCLK 因此,通过配置各种因数,内部时钟输入16MHZ最终PLLCLK作为系统时钟输出100MHZ
之后,便可编写SYSTICK的延时函数了。代码如下:
void delay_ms(uint16_t nms)
{
//HAL_Delay(nms);
uint32_t i;
SysTick_Config(4000);
for(i=0; i<nms; i++)
{
while( !((SysTick->CTRL) & (1<<16)) );
}
/* 失能systick */
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
void delay_us(uint32_t us)
{
uint32_t J;
SysTick_Config(40);
for(J=0; J<us; J++)
{
while( !((SysTick->CTRL) & (1<<16)) );
}
/* 失能systick */
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
当然,在此仅仅实验了一个毫秒级别的延时,后续在使用超神波模块的过程中会用到微秒级的延时,因此微妙级的延时暂且不实验。
学到这里,详细大家已经可以会对IO口进行基本的操作了,接下来将对超声波模块进行使用,并且将得到距离的信息通过串口的形式发送到电脑,从而验证得到的数据是否准确。
本篇教程视频链接:http://v.youku.com/v_show/id_XMzgyMjA5NDkwMA==.html?spm=a2hzp.8244740.0.0