【复旦微FM33LC046N评测】+ 部分外设的使用
本帖最后由 chrisrh 于 2021-3-25 16:55 编辑<p><span style="color:#c0392b;"><strong>1.使用串口printf输出结果</strong></span></p>
<p>//user_init.c----->Uart_printf<br />
PA13---->Uart0_RX<br />
PA14---->Uart0_TX</p>
<p>把user_init.c中的宏定义#ifndef MFANG去掉便可以使用printf</p>
<p>如果还不行就在options中勾选MicroLIB退出软件重新编译</p>
<p></p>
<hr />
<p> </p>
<p><span style="color:#c0392b;"><strong>2.使用PC9---->ADC_IN0采集电压</strong></span></p>
<p></p>
<p>参照例程进行ADC配置</p>
<p><1>配置FL_ADC_CommonInit---ADC共用寄存器设置以配置外设工作时钟</p>
<p><2>进行相应GPIO和ADC的初始化</p>
<p><3>配置完成后进行FL_ADC_Init();</p>
<p><4>调用GetSingleChannelVoltage_POLL(FL_ADC_EXTERNAL_CH0)查看ADC采样值</p>
<p>若设置ADC中断则通过GetSingleChannelVoltage_IT(FL_ADC_EXTERNAL_CH0)查看采样值</p>
<p>详细ADC介绍见附件</p>
<p></p>
<hr />
<p> </p>
<p><span style="color:#c0392b;"><strong>3.配置RTC时钟,读取RTC时间</strong></span></p>
<p></p>
<p><1>进行RTC配置</p>
<p>在进行RTC Initialization初始化配置时,年、月、日、周、时、分、秒的初始化赋值均为16进制写入;</p>
<p>读取到的RTC时间也为16进制数。</p>
<pre>
<code class="language-cpp">/**
* <a href="home.php?mod=space&uid=159083" target="_blank">@brief</a>RTC Initialization function
* @paramvoid
* @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 );
}</code></pre>
<hr />
<p> </p>
<p><2>将RTC的时间读出到RAM</p>
<pre>
<code class="language-cpp">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);
}</code></pre>
<p><3>丰富的RTC中断处理函数,可配置相应的函数</p>
<pre>
<code class="language-cpp">// 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); } //清除中断标志
}</code></pre>
<p></p>
<p> </p>
<hr />
<p> </p>
<p><span style="color:#c0392b;"><strong>4.</strong></span><span style="color:#c0392b;"><strong>揉合了一版使用过的程序</strong></span></p>
<p>上电后进入while循环OLED显示RTC时钟走时<br />
//key1中断进入PWM_LED呼吸灯<br />
//key4中断进入ADC_IN0采集电压</p>
<p></p>
<p><span style="color:#c0392b;"><strong>FM33LC046N用着不错,</strong></span></p>
<p>还没用RTOS,程序写的不好仅供参考,见附件···</p>
<p> </p>
<p>看FM33LC046配置RTC时钟和读取RTC时间一点不复杂</p>
<p>楼主可以谈谈使用上的感受,建议等。</p>
<p>谢谢分享,期待后续!</p>
<p>代码是否容易理解?操作是否容易?</p>
w494143467 发表于 2021-3-26 14:54
代码是否容易理解?操作是否容易?
<p>代码注释都挺全的,比较容易上手;函数库封装的和103类似,配置外设属于同样的思路,部分外设使用起来较103更好配置,总之很好用</p>
chrisrh 发表于 2021-3-30 11:50
代码注释都挺全的,比较容易上手;函数库封装的和103类似,配置外设属于同样的思路,部分外设使用起来较1 ...
<p>听到这个,感觉这个代码还是非常不错的!</p>
<p>下载学习一下 ,谢谢楼主</p>
下载学习一下 ,谢谢楼主
页:
[1]