打印
[CW32F030系列]

【CW32F030CxTx StartKit】2、点灯、时钟PLL到64MHZ、普通定时器

[复制链接]
1180|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CW32, ar, cw, hz
本帖最后由 freeelectron 于 2022-7-12 19:53 编辑

#申请原创#


1、前言:

官方的demo用的阻塞方式点灯,即就是死等,在等待期间mcu干不了其他事情(中断除外),这种方式不太友好,本文使用非阻塞方式点灯。


2、硬件连接

3、思路

利用定时器中断,每1ms中断一次,整个系统维护一个tick计数;

记录某一时刻的tick,用A表示,再获取当前的tick,用B表示,如果当前的B-A大于等于500(这里500ms闪烁一次),那么就执行一次led翻转,同时也更新A的值。


4、软件实现

(1)利用定时器中断,每1ms中断一次,整个系统维护一个tick计数,本文使用基础定时器1

static uint32_t SystemTick=0;

void TimerConfig(void)
{
    RCC_APBPeriphClk_Enable2(RCC_APB2_PERIPH_BTIM,ENABLE);

        NVIC_EnableIRQ(BTIM1_IRQn);
        
        BTIM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct;//1000000
        
        BTIM_TimeBaseInitStruct.BTIM_Mode = BTIM_Mode_TIMER;
        BTIM_TimeBaseInitStruct.BTIM_Period = 999;
        BTIM_TimeBaseInitStruct.BTIM_Prescaler = BTIM_PRS_DIV64; //64分频

        BTIM_TimeBaseInit(CW_BTIM1, &BTIM_TimeBaseInitStruct);
        BTIM_ITConfig(CW_BTIM1, BTIM_IT_OV, ENABLE);
        BTIM_Cmd(CW_BTIM1, ENABLE);
}


void BTIM1_IRQHandler(void)
{
        if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))
        {
                BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV);
                SystemTick++;
        }
}


uint32_t SystemGetTick(void)
{
        return SystemTick;
}

(2)时钟切换到PLL

默认的是HSI,本文使用HSE,再切换到PLL至64MHZ。

 RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_FLASH, ENABLE);   //打开FLASH时钟

        RCC_HSE_Enable(RCC_HSE_MODE_OSC, 16000000, RCC_HSE_DRIVER_NORMAL,RCC_HSE_FLT_CLOSE);
        RCC_PLL_Enable(RCC_PLLSOURCE_HSECLK, 16000000, 4);
        
        FLASH_SetLatency(FLASH_Latency_2);    //频率大于24M需要配置FlashWait=2

        while(RCC_SysClk_Switch( RCC_SYSCLKSRC_PLL ));
        
        
        RCC_SYSCLKSRC_Config(RCC_SYSCLKSRC_PLL);
        RCC_HCLKPRS_Config(RCC_HCLK_DIV1);
        RCC_PCLKPRS_Config(RCC_PCLK_DIV1);

(3)点灯

void LedInit(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
        
        RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_GPIOB,ENABLE);

    GPIO_InitStruct.IT = GPIO_IT_NONE;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pins = GPIO_PIN_8 | GPIO_PIN_9;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;

    GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
}


void SystemRun(void)
{
        static uint32_t curtick=0;
        
        if(SystemGetTick()-curtick>=500)
        {
        GPIO_TogglePin(CW_GPIOB, GPIO_PIN_8 | GPIO_PIN_9);

                curtick=SystemGetTick();
        }        
}

5、现象





使用特权

评论回复
沙发
海滨消消| | 2022-7-13 15:55 | 只看该作者
感谢分享测评贴,恭喜亮灯

使用特权

评论回复
板凳
huquanz711| | 2022-7-13 18:41 | 只看该作者
超频的话能不能正常运行

使用特权

评论回复
地板
freeelectron|  楼主 | 2022-7-13 20:17 | 只看该作者
huquanz711 发表于 2022-7-13 18:41
超频的话能不能正常运行

64M,没有超频哦

使用特权

评论回复
5
mcu021| | 2022-7-14 22:27 | 只看该作者
超到了88MHz,正常运行。

使用特权

评论回复
评论
pssyx 2022-7-15 09:02 回复TA
确定不是你的错觉?!试试测量一下HCLK_OUT,PCLK_OUT的频率。 
6
zhouminjie| | 2022-7-20 14:43 | 只看该作者
主频64M,FLASH_Latency_2是不是需要改为FLASH_Latency_3

使用特权

评论回复
7
uytyu| | 2022-8-18 17:54 | 只看该作者
不是只能48Mhz的频率吗   

使用特权

评论回复
8
minzisc| | 2022-11-3 20:45 | 只看该作者
如何设置为48Mhz的频率呢              

使用特权

评论回复
9
plsbackup| | 2022-11-3 20:58 | 只看该作者
CW32F030CxTx 最大支持多大的频率?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:stm32/LoRa物联网:304350312

65

主题

785

帖子

11

粉丝