【复旦微FM33LC046N评测】+ 部分外设的使用
[复制链接]
本帖最后由 chrisrh 于 2021-3-25 16:55 编辑
1.使用串口printf输出结果
//user_init.c----->Uart_printf
PA13---->Uart0_RX
PA14---->Uart0_TX
把user_init.c中的宏定义#ifndef MFANG去掉便可以使用printf
如果还不行就在options中勾选MicroLIB退出软件重新编译
2.使用PC9---->ADC_IN0采集电压
参照例程进行ADC配置
<1>配置FL_ADC_CommonInit---ADC共用寄存器设置以配置外设工作时钟
<2>进行相应GPIO和ADC的初始化
<3>配置完成后进行FL_ADC_Init();
<4>调用GetSingleChannelVoltage_POLL(FL_ADC_EXTERNAL_CH0)查看ADC采样值
若设置ADC中断则通过GetSingleChannelVoltage_IT(FL_ADC_EXTERNAL_CH0)查看采样值
详细ADC介绍见附件
FM33LC0xx-ADC应用说明.pdf
(748.28 KB, 下载次数: 13)
3.配置RTC时钟,读取RTC时间
<1>进行RTC配置
在进行RTC Initialization初始化配置时,年、月、日、周、时、分、秒的初始化赋值均为16进制写入;
读取到的RTC时间也为16进制数。
/**
* @brief RTC Initialization function
* @param void
* @retval None
*/
void MF_RTC_Init(uint8_t year,uint8_t month,uint8_t day,uint8_t week,uint8_t hour,uint8_t minute,uint8_t second)
{
/*IO CONFIG*/
FL_RTC_InitTypeDef defaultInitStruct;
defaultInitStruct.year = year; //0x21;
defaultInitStruct.month = month; //0x03;
defaultInitStruct.day = day; //0x25;
defaultInitStruct.week = week; //0x03;
defaultInitStruct.hour = hour; //0x09;
defaultInitStruct.minute = minute;//0x30;
defaultInitStruct.second = second;//0x00;
FL_RTC_Init(RTC,&defaultInitStruct );
}
<2>将RTC的时间读出到RAM
void RTC_Read(void)
{
FL_RTC_InitTypeDef GetTime;
//将RTC模块的时间 读出到ram
RTC_GetRTC(&GetTime);
GUI_ShowString(0,0,"20",16,1);
GUI_ShowNum(16,0,dec_to_hex(GetTime.year),2,16,1);
GUI_ShowCHinese(32,0,16,"年",1);
GUI_ShowNum(48,0,dec_to_hex(GetTime.month),2,16,1);
GUI_ShowCHinese(64,0,16,"月",1);
GUI_ShowNum(80,0,dec_to_hex(GetTime.day),2,16,1);
GUI_ShowCHinese(96,0,16,"日",1);
GUI_ShowCHinese(32,16,16,"星期",1);
GUI_ShowNum(64,16,dec_to_hex(GetTime.week),2,16,1);
GUI_ShowCHinese(0,32,16,"时间",1);
GUI_ShowString(32,32,":",16,1);
GUI_ShowNum(40,32,dec_to_hex(GetTime.hour),2,16,1);
GUI_ShowString(56,32,":",16,1);
GUI_ShowNum(64,32,dec_to_hex(GetTime.minute),2,16,1);
GUI_ShowString(80,32,":",16,1);
GUI_ShowNum(88,32,dec_to_hex(GetTime.second),2,16,1);
}
<3>丰富的RTC中断处理函数,可配置相应的函数
// RTC中断处理函数
void RTC_IRQHandler(void)
{
//闹钟中断
if(ENABLE == FL_RTC_IsEnabledIT_Alarm(RTC) &&
SET == FL_RTC_IsActiveFlag_Alarm(RTC))//查询标志是否置起
{ FL_RTC_ClearFlag_Alarm(RTC); } //清除中断标志
//1KHz中断
if(ENABLE == FL_RTC_IsEnabledIT_1KHz(RTC) &&
SET == FL_RTC_IsActiveFlag_1KHz(RTC))//查询标志是否置起
{ FL_RTC_ClearFlag_1KHz(RTC); } //清除中断标志
//256Hz中断
if(ENABLE == FL_RTC_IsEnabledIT_256Hz(RTC) &&
SET == FL_RTC_IsActiveFlag_256Hz(RTC))//查询标志是否置起
{ FL_RTC_ClearFlag_256Hz(RTC); } //清除中断标志
//64Hz中断
if(ENABLE == FL_RTC_IsEnabledIT_64Hz(RTC) &&
SET == FL_RTC_IsActiveFlag_64Hz(RTC))//查询标志是否置起
{ FL_RTC_ClearFlag_64Hz(RTC); } //清除中断标志
//16Hz中断
if(ENABLE == FL_RTC_IsEnabledIT_16Hz(RTC) &&
SET == FL_RTC_IsActiveFlag_16Hz(RTC))//查询标志是否置起
{ FL_RTC_ClearFlag_16Hz(RTC); } //清除中断标志
//8Hz中断
if(ENABLE == FL_RTC_IsEnabledIT_8Hz(RTC) &&
SET == FL_RTC_IsActiveFlag_8Hz(RTC))//查询标志是否置起
{ FL_RTC_ClearFlag_8Hz(RTC); } //清除中断标志
//4Hz中断
if(ENABLE == FL_RTC_IsEnabledIT_4Hz(RTC) &&
SET == FL_RTC_IsActiveFlag_4Hz(RTC))//查询标志是否置起
{ FL_RTC_ClearFlag_4Hz(RTC); } //清除中断标志
//2Hz中断
if(ENABLE == FL_RTC_IsEnabledIT_2Hz(RTC) &&
SET == FL_RTC_IsActiveFlag_2Hz(RTC))//查询标志是否置起
{ FL_RTC_ClearFlag_2Hz(RTC); } //清除中断标志
// 秒中断
if(ENABLE == FL_RTC_IsEnabledIT_Second(RTC) &&
SET == FL_RTC_IsActiveFlag_Second(RTC))//查询标志是否置起
{ FL_RTC_ClearFlag_Second(RTC); } //清除中断标志
// 分钟中断
if(ENABLE == FL_RTC_IsEnabledIT_Minute(RTC) &&
SET == FL_RTC_IsActiveFlag_Minute(RTC))//查询标志是否置起
{ FL_RTC_ClearFlag_Minute(RTC); } //清除中断标志
// 小时中断
if(ENABLE == FL_RTC_IsEnabledIT_Hour(RTC) &&
SET == FL_RTC_IsActiveFlag_Hour(RTC))//查询标志是否置起
{ FL_RTC_ClearFlag_Hour(RTC); } //清除中断标志
// 天中断
if(ENABLE == FL_RTC_IsEnabledIT_Day(RTC) &&
SET == FL_RTC_IsActiveFlag_Day(RTC))//查询标志是否置起
{ FL_RTC_ClearFlag_Day(RTC); } //清除中断标志
}
4.揉合了一版使用过的程序
上电后进入while循环OLED显示RTC时钟走时
//key1中断进入PWM_LED呼吸灯
//key4中断进入ADC_IN0采集电压
FM33LC046N用着不错,
还没用RTOS,程序写的不好仅供参考,见附件···
|