复旦微FM33LG025单片机PWM信号输出
最近项目用到了复旦微的FM33LG025单片机,这是我第一次使用复旦微单片机,以下通过一个输出PWM信号的工程为例,码点文字记录一下学习过程和遇到的坑。
1、新建工程
复旦微提供了一个线上的芯片应用、配置工具——MFang,读作“魔方”。使用MFang不需要下载和安装,更不需要破解和激活,打开浏览器即可在线操作所有数据实时云端存储。这个工具跟ST的STM32CubeMX类似,只不过MFang是网页版,STM32CubeMX是安装版。
废话不多说,我们进入实操环节。
首先打开MFang,链接如下:https://mfang2.fmdevelopers.com.cn/
进入工作区,如下图所示:
点击“新建”→“新建工程”创建一个新工程,注意芯片型号要选对,FL驱动库我们选择最新版V2.3,选择“空白工程”后点击“确定”按钮即可,如下图所示:
2、配置工程
接着就来到了工程配置界面,如下图所示。
点击上图右上角的“时钟配置”进入时钟配置页面,如下图所示:
我使用的是外部晶振,配置时钟分为以下三步,1、打开XTHF;2、填写晶振频率,我用的是16MHz,填16;3、在SYSCLK Mux(多路时钟选择器)中选择XTHF为系统时钟。配置完记得点击“保存”按钮!
接着退出来,回到工程配置主界面,先配置下载接口,在System中找到SWD,然后把SWD的开关置位ON,如果没打开这个开关是否默认为JTAG?谁试过了可以告诉我!
然后按照下图的7个步骤配置通用定时器1,功能是在PC0引脚输出一个周期为10ms,占空比为50%的PWM信号。
3、生成工程代码
点击工程配置主界面右上角的“下载工程”按钮,弹出如下窗口,工程名默认即可,我们选择生成一个ARM-MDK工程,然后直接点击“下载”按钮即可生成并下载工程代码压缩包。
4、运行与调试
将工程代码压缩包解压后,双击打开KEIL工程。接下来我们看一下自动生成的代码,首先是main()函数,如下:
int main(void)
{/* Initialize FL Driver Library */FL_Init();/* Configure the system clock */MF_Clock_Init();/* Initialize all configured peripherals */MF_Config_Init();while(1){ }}
外设配置在MF_Config_Init()函数中,以下截取几个关键函数:
void MF_Config_Init(void)
{/* Initial GPTIM1 */MF_GPTIM1_TimerBase_Init();MF_GPTIM1_FL_GPTIM_CHANNEL_1_Channel1_Init();FL_GPTIM_Enable(GPTIM1); // 启动GPTIM1定时器/* Initial SWD */MF_SWD_IO_Init();
}void MF_GPTIM1_TimerBase_Init(void)
{FL_GPTIM_InitTypeDef TimerBase_InitStruct;TimerBase_InitStruct.prescaler = 159;TimerBase_InitStruct.counterMode = FL_GPTIM_COUNTER_DIR_UP;TimerBase_InitStruct.autoReload = 999; TimerBase_InitStruct.clockDivision = FL_GPTIM_CLK_DIVISION_DIV1;TimerBase_InitStruct.autoReloadState = FL_ENABLE;FL_GPTIM_Init(GPTIM1, &TimerBase_InitStruct);
}void MF_GPTIM1_FL_GPTIM_CHANNEL_1_Channel1_Init(void)
{FL_GPIO_InitTypeDef GPIO_InitStruct;FL_GPTIM_OC_InitTypeDef GPTIM1_InitStruct;/* PC0 GPTIM1_CH1 */ GPIO_InitStruct.pin = FL_GPIO_PIN_0;GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;GPIO_InitStruct.pull = FL_DISABLE;GPIO_InitStruct.remapPin = FL_DISABLE;GPIO_InitStruct.analogSwitch = FL_DISABLE;FL_GPIO_Init(GPIOC, &GPIO_InitStruct);GPTIM1_InitStruct.OCMode = FL_GPTIM_OC_MODE_PWM1;GPTIM1_InitStruct.OCETRFStatus = FL_DISABLE;GPTIM1_InitStruct.OCFastMode = FL_DISABLE;GPTIM1_InitStruct.compareValue = 500;GPTIM1_InitStruct.OCPolarity = FL_GPTIM_OC_POLARITY_NORMAL;GPTIM1_InitStruct.OCPreload = FL_DISABLE;FL_GPTIM_OC_Init(GPTIM1, FL_GPTIM_CHANNEL_1, &GPTIM1_InitStruct);
}
注意,自动生成的代码只有GPTIM1定时器的初始化配置,定时器并未打开,需要我们手动增加启动定时器函数FL_GPTIM_Enable(GPTIM1),如上图,我将其放在了MF_Config_Init()函数的定时器配置语句后面。FL_GPTIM_Enable()是一个FL库函数,可以在fm33lg0xx_fl_gptim.h文件中找到。
接下来开始调试代码,点击“Start/Stop Debug Session”按钮启动调试,发现代码无法运行,如下图所示。
这个问题足足折腾了我一个下午,后来发现重新选择一下芯片就可以了,可以说巨坑无比,难道官方没有发现这个问题吗?
我们重新配置一下工程,首先进入Device窗口,先选择FM33LG01X,再重新选回FM33LG02X。
再去Target窗口将时钟改为16MHz。
再去Debug窗口选择正确的烧录器,我用的是J-LINK。
最后将下载口选择为SW。
然后重新Debug,如下图,可以看到代码已经能正常运行了。
以下是输出波形:
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!