[AT32M412] 【AT-START-M412测评】+RTC电子时钟

[复制链接]
 楼主| 发表于 2025-5-27 11:31 | 显示全部楼层 |阅读模式
AT32M412开发板配以内置的RTC计时器,可以轻松地实现日历的计时功能,为能直观地观察,可利用开发板上的Arduino接口来快速地实现扩展。
523630194677ad75c635ad5ec3970b93
图1 测试结果

为简便起见,这里只通过J3来接入一个I2C接口的OLED屏,其中PA5连接OLED屏的SCK引脚,PA6连接OLED屏的SDA引脚。
fdf8373c001754d5767be3aea42f1641
图2 所用接口

对OLED显示屏所用引脚进行配置的函数为:
  1. void oled_config()
  2. {
  3. gpio_init_type gpio_init_struct;
  4. crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  5. gpio_default_para_init(&gpio_init_struct);
  6. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  7. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  8. gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  9. gpio_init_struct.gpio_pins = GPIO_PINS_5|GPIO_PINS_6;
  10. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  11. gpio_init(GPIOA, &gpio_init_struct);
  12. }

控制所用引脚输出高低电平的语句定义为:
#define OLED_SCLK_Clr()   GPIOA->clr = GPIO_PINS_5
#define OLED_SCLK_Set()   GPIOA->scr = GPIO_PINS_5
#define OLED_SDIN_Clr()   GPIOA->clr = GPIO_PINS_6
#define OLED_SDIN_Set()   GPIOA->scr = GPIO_PINS_6
对OLED屏进行初始化的函数为:
  1. void OLED_Init(void)
  2. {
  3. Write_IIC_Command(0xAE); //display off
  4. Write_IIC_Command(0x20); //Set Memory Addressing Mode
  5. Write_IIC_Command(0x10);
  6. Write_IIC_Command(0xb0);//Set Page Start Address for Page Addressing Mode,0-7
  7. Write_IIC_Command(0xc8);//Set COM Output Scan Direction
  8. Write_IIC_Command(0x00);//---set low column address
  9. Write_IIC_Command(0x10);//---set high column address
  10. Write_IIC_Command(0x40);//--set start line address
  11. Write_IIC_Command(0x81);//--set contrast control register
  12. Write_IIC_Command(0xdf);
  13. Write_IIC_Command(0xa1);//--set segment re-map 0 to 127
  14. Write_IIC_Command(0xa6);//--set normal display
  15. Write_IIC_Command(0xa8);//--set multiplex ratio(1 to 64)
  16. Write_IIC_Command(0x3F);//
  17. Write_IIC_Command(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content
  18. Write_IIC_Command(0xd3);//-set display offset
  19. Write_IIC_Command(0x00);//-not offset
  20. Write_IIC_Command(0xd5);//--set display clock divide ratio/oscillator frequency
  21. Write_IIC_Command(0xf0);//--set divide ratio
  22. Write_IIC_Command(0xd9);//--set pre-charge period
  23. Write_IIC_Command(0x22); //
  24. Write_IIC_Command(0xda);//--set com pins hardware configuration
  25. Write_IIC_Command(0x12);
  26. Write_IIC_Command(0xdb);//--set vcomh
  27. Write_IIC_Command(0x20);//0x20,0.77xVcc
  28. Write_IIC_Command(0x8d);//--set DC-DC enable
  29. Write_IIC_Command(0x14);//
  30. Write_IIC_Command(0xaf);//--turn on oled panel
  31. }

实现字符显示的函数为:
  1. void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)
  2. {
  3. unsigned char c=0,i=0;
  4. c=chr-' ';
  5. if(x>Max_Column-1){x=0;y=y+2;}
  6. if(Char_Size ==16)
  7. {
  8. OLED_Set_Pos(x,y);
  9. for(i=0;i<8;i++)
  10. OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  11. OLED_Set_Pos(x,y+1);
  12. for(i=0;i<8;i++)
  13. OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  14. }
  15. else {
  16. OLED_Set_Pos(x,y);
  17. for(i=0;i<6;i++)
  18. OLED_WR_Byte(F6x8[c][i],OLED_DATA);
  19. }
  20. }

实现数据显示的函数为:
  1. void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size2)
  2. {
  3. uint8_t t,temp;
  4. uint8_t enshow=0;
  5. for(t=0;t<len;t++)
  6. {
  7. temp=(num/oled_pow(10,len-t-1))%10;
  8. if(enshow==0&&t<(len-1))
  9. {
  10. if(temp==0)
  11. {
  12. OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
  13. continue;
  14. }else enshow=1;
  15. }
  16. OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
  17. }
  18. }

实现RTC电子时钟功能的主程序为:
  1. int main(void)
  2. {
  3. exint_init_type exint_init_struct;
  4. ertc_time_type time;
  5. uint32_t temp = 0;
  6. ertc_clock_config();
  7. system_clock_config();
  8. nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  9. at32_board_init();
  10. oled_config();
  11. OLED_Init();
  12. OLED_Clear();
  13. OLED_ShowString(20,0,"AT32M412",16);
  14. OLED_ShowString(20,2," : :",16);
  15. OLED_ShowString(20,4," - -",16);
  16. crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);
  17. pwc_battery_powered_domain_access(TRUE);
  18. if (ertc_bpr_data_read(ERTC_DT1) != 0x1234)
  19. {
  20. ertc_config();
  21. }
  22. else
  23. {
  24. ertc_wait_update();
  25. ertc_flag_clear(ERTC_ALAF_FLAG);
  26. exint_flag_clear(EXINT_LINE_17);
  27. }
  28. exint_default_para_init(&exint_init_struct);
  29. exint_init_struct.line_enable = TRUE;
  30. exint_init_struct.line_mode = EXINT_LINE_INTERRUPT;
  31. exint_init_struct.line_select = EXINT_LINE_17;
  32. exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
  33. exint_init(&exint_init_struct);
  34. nvic_irq_enable(ERTCAlarm_IRQn, 0, 1);
  35. ertc_calendar_get(&time);
  36. OLED_ShowNum(20,4,time.year,2,16);
  37. OLED_ShowNum(44,4,time.month,2,16);
  38. OLED_ShowNum(68,4,time.day,2,16);
  39. while(1)
  40. {
  41. ertc_calendar_get(&time);
  42. if(temp != time.sec)
  43. {
  44. temp = time.sec;
  45. OLED_ShowNum(20,2,time.hour,2,16);
  46. OLED_ShowNum(44,2,time.min,2,16);
  47. OLED_ShowNum(68,2,time.sec,2,16);
  48. }
  49. }
  50. }

经程序的编译和下载,其测试效果如图3所示。
de6a53520177b445dcb7fda26fe5bc95
图3 运行效果

发表于 2025-6-18 16:40 | 显示全部楼层
楼主用的是标准库吗,还是雅特力官方给出来的cube工具?
 楼主| 发表于 2025-6-18 17:03 | 显示全部楼层
AuroraWaltz 发表于 2025-6-18 16:40
楼主用的是标准库吗,还是雅特力官方给出来的cube工具?

标准库
您需要登录后才可以回帖 登录 | 注册

本版积分规则

510

主题

2921

帖子

39

粉丝
快速回复 返回顶部 返回列表