本帖最后由 秦生0303 于 2022-7-4 21:36 编辑
很快就收到了开发板,没有板载的调试器,不过引出了SWD调试接口,板子也极大的考虑了测试的自由性,所有的引脚都被引出,接下来就让我们一起去熟悉CW32F030的软件工程,本人使用的是IAR8.30,创建如下工程文件:
其中Libraries对应的就是cw32f030-stdperiph-lib中的Libraries,这里面是CW32F030芯片的各个功能的底层函数; 然后Template中的main和interrupts_cw32f030就是该工程的主函数文件和中断函数文件; 启动文件存放到Startup中; 在工程里边建立IAR_project(存放工程文件)和CMSIS(存放配置文件及基础文件例如icf等)文件夹。
接下来就是配置IAR: 选择工程名——Options; 选择单片机
配置CMSIS,一种方法是使用IAR自带的内核文件,一种是在咱们自己创建的CMSIS中添加厂家提供的文件,CW不存在兼容问题,可以直接用IAR的内核文件。
配置include,注意一定要把对应的C文件和头文件所在文件夹都添加进去: 配置输出文件:
配置Linker configuration:
仿真配置:本人使用Jlink调试,选择正确的调试工具
选择正确的FlashLoader
Jlink配置:注意选择SWD模式
到这里咱们的IAR配置就基本完成了,属于个人的工程,就可以开始程序编写,不需要写具体的程序,先Make一下,检查一下是否还有一些未知的配置错误,可以根据提示进行修改。
程序的运行是根据启动文件的顺序进行了,对于时钟配置可以直接在SystemInit中进行修改,而且启动文件已经调用了,不用再在main中重新调用。 大家看一下下面错误的时钟配置函数: // RCC_SYSCLKSRC_Config(RCC_SYSCLKSRC_PLL);
// RCC_HCLKPRS_Config(RCC_HCLK_DIV1);
// RCC_PCLKPRS_Config(RCC_PCLK_DIV2);
// RCC_HSE_Enable( RCC_HSE_MODE_OSC, 16000000,RCC_HSE_DRIVER_NORMAL, RCC_HSE_FLT_CLOSE);
// RCC_PLL_Enable(RCC_PLLSOURCE_HSECLK,16000000,4);
//
// res = RCC_SysClk_Switch( RCC_SYSCLKSRC_PLL );
本开发板使用16M外部时钟,最大可以配置64M主频,但是将这样的时钟配置下载后直接导致芯片锁了,Jlink直接无法识别,只能通过CW Programmer V1.53使用ISP的方式清除Flash才回复正常。 接下来参考rcc_hsi_pll(src_hse)中的时钟配置,有一条有关Flash读等待周期的配置,查看使用手册,有一条非常显著的提醒:系统时钟切换时需要同步配置FLASH 控制寄存器FLASH_CR2.WAIT 读等待周期参数:系统时钟频率不大于24MHz 则应设置FLASH 控制寄存器FLASH_CR2.WAIT 为0;系统时钟频率大于24MHz 则应设置FLASH控制寄存器FLASH_CR2.WAIT为1;系统时钟频率大于48MHz 则应设置FLASH 控制寄存器FLASH_CR2.WAIT 为2。当前被锁的原因应该就是在这里,030的最大主频为64M,因此FLASH_CR2.WAIT选择2。 修改后如下: RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_FLASH, ENABLE); //打开FLASH时钟
RCC_HCLKPRS_Config(RCC_HCLK_DIV1);
RCC_PCLKPRS_Config(RCC_PCLK_DIV2);
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
RCC_SysClk_Switch(RCC_SYSCLKSRC_PLL );
通过时钟参数的获取可以查看配置是否正确,其中res = 64M,res1 = 32M。
LED的控制基本上就是普通IO口的控制,这里注意延时函数的选择,时钟修改后对应的选择数也要发生变化,基本上都不是特别精准的。 GPIO_InitTypeDef GPIO_InitStruct;
CW_SYSCTRL->AHBEN_f.GPIOB = 1; //Open GPIOB Clk
//set PB08 / PB09 as inupt with pur / int = none
GPIO_InitStruct.Pins = GPIO_PIN_8 | GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.IT = GPIO_IT_LOW;
GPIO_Init( CW_GPIOB , &GPIO_InitStruct);
GPIO_WritePin( CW_GPIOB , GPIO_PIN_8 , GPIO_Pin_SET );
while(1)
{
PB08_TOG();
FirmwareDelay(10000000);//不精准定时1s
}
|