秦天qintian0303 发表于 2022-10-3 00:44

【国民技术N32G430】04 配置时钟,运行点灯

本帖最后由 秦天qintian0303 于 2022-10-3 00:50 编辑

<p>04 配置时钟,运行点灯</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N32G430的时钟树:</p>

<p></p>

<p>根据时钟树的信息进行时钟配置:</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;1、使用外部快速时钟(8M),目标系统时钟128M;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;2、配置PLL的时钟源为HSE,倍频16,并使能;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;3、配置系统时钟源并使能,得到SYSCLK为128M;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;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(&amp;clocks);

port_Delay_init();

}</code></pre>

<p>&nbsp;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作为主要的延时工具,滴答时钟的配置必要的,有关定时器的配置例程并没有找到,估计官方认为这是一个比较小的细节,通过查找在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-&gt;LOAD = (uint32_t)(nus * fac_us);
SysTick-&gt;VAL = 0x00;
SysTick-&gt;CTRL |= SysTick_CTRL_ENABLE_Msk ;
do
{
    temp = SysTick-&gt;CTRL;
}while((temp &amp; 0x01) &amp;&amp; !(temp &amp; (1 &lt;&lt; 16)));

SysTick-&gt;CTRL &amp;= ~SysTick_CTRL_ENABLE_Msk;
SysTick-&gt;VAL = 0x00;
}

void delay_ms(uint16_t nms)
{
uint32_t temp = 0;
while(nms)
{
    if(nms &gt; STEP_DELAY_MS)
    {
      SysTick-&gt;LOAD = (uint32_t)(STEP_DELAY_MS * fac_ms);
      nms -= STEP_DELAY_MS;
    }
    else
    {
      SysTick-&gt;LOAD = (uint32_t)(nms * fac_ms);
      nms = 0;
    }
    SysTick-&gt;VAL = 0x00;
    SysTick-&gt;CTRL |= SysTick_CTRL_ENABLE_Msk;
    do
    {
      temp = SysTick-&gt;CTRL;
    }while((temp &amp; 0x01) &amp;&amp; !(temp &amp; (1 &lt;&lt; 16)));

    SysTick-&gt;CTRL &amp;= ~SysTick_CTRL_ENABLE_Msk;
    SysTick-&gt;VAL = 0x00;
}
}</code></pre>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在进行IO初始化时发现了一个不太友好的问题,类似下图这种,没有对各分选项进行精确的说明,这样对于新接触的人不友好,建议添加说明,每一个都通过查看数据手册去了解具体的含义就太麻烦了。</p>

<p></p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>问题一个:</strong>N32G430C8L7_STB_V1.0.pdf中关于LED引脚和UG_N32G430C8L7_STB开发板硬件使用指南V1.0中的不一致。</p>

<p>运行后的时钟采集;</p>

<p></p>

<p>点灯视频:</p>

<p>b00898bea6f496e58fb8e6acc33dbeb4<br />
&nbsp;</p>

lugl4313820 发表于 2022-10-3 21:28

<p><strong>问题一个:</strong>N32G430C8L7_STB_V1.0.pdf中关于LED引脚和UG_N32G430C8L7_STB开发板硬件使用指南V1.0中的不一致。</p>

<p>很细心呀!</p>

秦天qintian0303 发表于 2022-10-4 19:26

lugl4313820 发表于 2022-10-3 21:28
问题一个:N32G430C8L7_STB_V1.0.pdf中关于LED引脚和UG_N32G430C8L7_STB开发板硬件使用指南V1.0中的不一致 ...

<p>在进行配置的时候原理图的PDF因为字体原因打不开,就使用的硬件使用指南,后来另一台电脑上能看才发现的不对</p>
页: [1]
查看完整版本: 【国民技术N32G430】04 配置时钟,运行点灯