【国民技术N32G430】04 配置时钟,运行点灯
本帖最后由 秦天qintian0303 于 2022-10-3 00:50 编辑<p>04 配置时钟,运行点灯</p>
<p> N32G430的时钟树:</p>
<p></p>
<p>根据时钟树的信息进行时钟配置:</p>
<p> 1、使用外部快速时钟(8M),目标系统时钟128M;</p>
<p> 2、配置PLL的时钟源为HSE,倍频16,并使能;</p>
<p> 3、配置系统时钟源并使能,得到SYSCLK为128M;</p>
<p> 4、AHB=SYSCLK=128M,APB1=AHB/4=32M,APB1=AHB/2=64M;</p>
<p>配置代码:</p>
<pre>
<code>//******************************************************************************
//* 函数名称: system_clock_config
//* 函数描述: 系统时钟配置
//* 输入参数:
//* 参数描述: 对应
// - system clock = HEXT * pll_mult
//* - system clock source = pll (HEXT)
//* - HEXT = 8000000
//* - sclk = 128000000
//* - ahbdiv = 1
//* - ahbclk = 128000000
//* - apb2div = 2
//* - apb2clk = 64000000
//* - apb1div = 4
//* - apb1clk = 32000000
//* - pll_mult = 16
//* 输出参数: 无
//* 返回值 : 无
//******************************************************************************
void system_clock_config(void)
{
RCC_Reset();/* reset RCC */
RCC_HSE_Config(RCC_HSE_ENABLE);
while(RCC_HSE_Stable_Wait() != SUCCESS);/* wait till hick is ready */
RCC_PLL_Config(RCC_PLL_SRC_HSE_DIV1,RCC_PLL_MUL_16);/* config pll clock resource */
RCC_PLL_Enable();/* enable pll */
RCC_Sysclk_Config(RCC_SYSCLK_SRC_PLLCLK);/* Configures the system clock (SYSCLK) */
RCC_Hclk_Config(RCC_SYSCLK_DIV1);
RCC_Pclk1_Config(RCC_HCLK_DIV4);//Pclk1最高32M
RCC_Pclk2_Config(RCC_HCLK_DIV2);//Pclk2最高64M
RCC_TIM1_8_Clock_Config(RCC_TIM1_8_CLKSRC_SYSCLK);
RCC_ADC_1M_Clock_Config(RCC_ADC1MCLK_SRC_HSE,RCC_ADC1MCLK_DIV8);//计时时钟必须配置成1MHz
RCC_ADC_Hclk_Config(RCC_ADCHCLK_DIV2);//采样时钟最高80M
RCC_ADC_Hclk_Enable();
RCC_LSE_Config(RCC_LSE_ENABLE,0x141);
while(RCC_LSE_Stable_Wait() != SUCCESS);/* wait till hick is ready */
RCC_RTC_Clock_Config(RCC_RTCCLK_SRC_LSE);
RCC_RTC_Clock_Enable();
RCC_Clocks_Frequencies_Value_Get(&clocks);
port_Delay_init();
}</code></pre>
<p> </p>
<p> 作为主要的延时工具,滴答时钟的配置必要的,有关定时器的配置例程并没有找到,估计官方认为这是一个比较小的细节,通过查找在misc.c中找到配置函数。注意滴答时钟是一个24位的减数器,ms定时有上限所以需要进行一下设计防止溢出。</p>
<p>滴答定时器代码:</p>
<pre>
<code>//******************************************************************************
//* 函数名称: port_Delay_init
//* 函数描述: 滴答时钟初始化
//* 输入参数:
//* 参数描述: 对应 IO口初始化及初始状态
//* 输出参数: 无
//* 返回值 : 无
//******************************************************************************
void port_Delay_init(void)
{
/* configure systick */
SysTick_Clock_Source_Set(SYSTICK_CLKSOURCE_HCLK);
fac_us = clocks.HclkFreq / (1000000U);
fac_ms = fac_us * (1000U);
}
void delay_us(uint32_t nus)
{
uint32_t temp = 0;
SysTick->LOAD = (uint32_t)(nus * fac_us);
SysTick->VAL = 0x00;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;
do
{
temp = SysTick->CTRL;
}while((temp & 0x01) && !(temp & (1 << 16)));
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0x00;
}
void delay_ms(uint16_t nms)
{
uint32_t temp = 0;
while(nms)
{
if(nms > STEP_DELAY_MS)
{
SysTick->LOAD = (uint32_t)(STEP_DELAY_MS * fac_ms);
nms -= STEP_DELAY_MS;
}
else
{
SysTick->LOAD = (uint32_t)(nms * fac_ms);
nms = 0;
}
SysTick->VAL = 0x00;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
do
{
temp = SysTick->CTRL;
}while((temp & 0x01) && !(temp & (1 << 16)));
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0x00;
}
}</code></pre>
<p> 在进行IO初始化时发现了一个不太友好的问题,类似下图这种,没有对各分选项进行精确的说明,这样对于新接触的人不友好,建议添加说明,每一个都通过查看数据手册去了解具体的含义就太麻烦了。</p>
<p></p>
<p> <strong>问题一个:</strong>N32G430C8L7_STB_V1.0.pdf中关于LED引脚和UG_N32G430C8L7_STB开发板硬件使用指南V1.0中的不一致。</p>
<p>运行后的时钟采集;</p>
<p></p>
<p>点灯视频:</p>
<p>b00898bea6f496e58fb8e6acc33dbeb4<br />
</p>
<p><strong>问题一个:</strong>N32G430C8L7_STB_V1.0.pdf中关于LED引脚和UG_N32G430C8L7_STB开发板硬件使用指南V1.0中的不一致。</p>
<p>很细心呀!</p>
lugl4313820 发表于 2022-10-3 21:28
问题一个:N32G430C8L7_STB_V1.0.pdf中关于LED引脚和UG_N32G430C8L7_STB开发板硬件使用指南V1.0中的不一致 ...
<p>在进行配置的时候原理图的PDF因为字体原因打不开,就使用的硬件使用指南,后来另一台电脑上能看才发现的不对</p>
页:
[1]