[其他] 【HC32L196PCTA测评】6.LCD+WDT+RTC+FLASH测试

[复制链接]
1835|2
 楼主| yuyy1989 发表于 2023-8-8 11:21 | 显示全部楼层 |阅读模式
本帖最后由 yuyy1989 于 2023-8-10 11:17 编辑

#申请原创# @21小跑堂  
6.LCD+WDT+RTC+FLASH测试
6.1LCD测试
HC32L196集成了LCD液晶控制模块,在这块开发板上也有一块4位段码LCD屏,接下来使用这个段码屏结合定时器做个秒表
LCD的相关IO在stkhc32l19x.h中已经被定义好了
QQ截图20230807224625.png
初始化IO

  1. void lcd_io_init()
  2. {
  3.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
  4.     Gpio_SetAnalogMode(STK_LCD_COM0_PORT, STK_LCD_COM0_PIN);  //COM0
  5.     Gpio_SetAnalogMode(STK_LCD_COM1_PORT, STK_LCD_COM1_PIN); //COM1
  6.     Gpio_SetAnalogMode(STK_LCD_COM2_PORT, STK_LCD_COM2_PIN); //COM2
  7.     Gpio_SetAnalogMode(STK_LCD_COM3_PORT, STK_LCD_COM3_PIN); //COM3   

  8.     Gpio_SetAnalogMode(STK_LCD_SEG0_PORT, STK_LCD_SEG0_PIN);  //SEG0
  9.     Gpio_SetAnalogMode(STK_LCD_SEG1_PORT, STK_LCD_SEG1_PIN);  //SEG1
  10.     Gpio_SetAnalogMode(STK_LCD_SEG2_PORT, STK_LCD_SEG2_PIN);  //SEG2
  11.     Gpio_SetAnalogMode(STK_LCD_SEG3_PORT, STK_LCD_SEG3_PIN);  //SEG3
  12.     Gpio_SetAnalogMode(STK_LCD_SEG4_PORT, STK_LCD_SEG4_PIN);  //SEG4
  13.     Gpio_SetAnalogMode(STK_LCD_SEG5_PORT, STK_LCD_SEG5_PIN); //SEG5
  14.     Gpio_SetAnalogMode(STK_LCD_SEG6_PORT, STK_LCD_SEG6_PIN); //SEG6
  15.     Gpio_SetAnalogMode(STK_LCD_SEG7_PORT, STK_LCD_SEG7_PIN); //SEG7
  16.     Gpio_SetAnalogMode(GpioPortB, GpioPin3);  //VLCDH
  17.     Gpio_SetAnalogMode(GpioPortB, GpioPin4);  //VLCD3
  18.     Gpio_SetAnalogMode(GpioPortB, GpioPin5);  //VLCD2
  19.     Gpio_SetAnalogMode(GpioPortB, GpioPin6);  //VLCD1
  20. }
LCD模块使用低速时钟,因此要开启内部低速时钟或外部低速晶振
QQ截图20230807224335.png
初始化LCD模块

  1. #define LCD_MODE 0
  2. void lcd_init()
  3. {
  4.     stc_lcd_cfg_t LcdInitStruct;
  5.     stc_lcd_segcom_t LcdSegCom;
  6.    
  7.     Sysctrl_ClkSourceEnable(SysctrlClkXTL,TRUE);
  8.     Sysctrl_SetPeripheralGate(SysctrlPeripheralLcd,TRUE);   ///< 开启LCD时钟

  9.     LcdSegCom.u32Seg0_31 = 0xffffff00;                              ///< 配置LCD_POEN0寄存器 开启SEG0~SEG7
  10.     LcdSegCom.stc_seg32_51_com0_8_t.seg32_51_com0_8 = 0xffffffff;   ///< 初始化LCD_POEN1寄存器 全部关闭输出端口
  11.     LcdSegCom.stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = 0;          ///< 使能COM0~COM3
  12.     LcdSegCom.stc_seg32_51_com0_8_t.segcom_bit.Mux = 0;             ///< Mux=0,Seg32_35=0,BSEL=1表示:选择外部电容工作模式,内部电阻断路
  13.     LcdSegCom.stc_seg32_51_com0_8_t.segcom_bit.Seg32_35 = 0;
  14.     Lcd_SetSegCom(&LcdSegCom);                                      ///< LCD COMSEG端口配置

  15.     LcdInitStruct.LcdBiasSrc = LcdExtCap;                          ///< 电容分压模式,需要外部电路配合
  16.     LcdInitStruct.LcdDuty = LcdDuty4;                              ///< 1/4duty
  17.     LcdInitStruct.LcdBias = LcdBias3;                              ///< 1/3 BIAS
  18.     LcdInitStruct.LcdCpClk = LcdClk2k;                             ///< 电压泵时钟频率选择2kHz
  19.     LcdInitStruct.LcdScanClk = LcdClk128hz;                        ///< LCD扫描频率选择128Hz
  20.     LcdInitStruct.LcdMode = LCD_MODE==0?LcdMode0:LcdMode1;                              
  21.     LcdInitStruct.LcdClkSrc = LcdXTL;                              ///< LCD时钟选择XTL
  22.     LcdInitStruct.LcdEn   = LcdEnable;                             ///< 使能LCD模块
  23.     Lcd_Init(&LcdInitStruct);
  24. }
来看看如何显示指定的数字,先找到这块屏的资料
QQ截图20230806230900.png
在看看手册里是怎么控制的
模式0
QQ截图20230807200658.png
模式1
QQ截图20230807200637.png
显示代码

  1. #if(LCD_MODE == 0)
  2. uint32_t lcdrambuffer[2] = {0};
  3. #else
  4. uint8_t lcdrambuffer[4] = {0};
  5. #endif
  6. void lcdshow09num(uint8_t num,uint8_t pos)
  7. {
  8.     if(pos > 3)
  9.         return;
  10.     #if(LCD_MODE == 0)
  11.     uint32_t temp;
  12.     switch(num)
  13.     {
  14.         case 0:
  15.             temp = 0x0F05;
  16.             break;
  17.         case 1:
  18.             temp = 0x0600;
  19.             break;
  20.         case 2:
  21.             temp = 0x0B06;
  22.             break;
  23.         case 3:
  24.             temp = 0x0F02;
  25.             break;
  26.         case 4:
  27.             temp = 0x0603;
  28.             break;
  29.         case 5:
  30.             temp = 0x0D03;
  31.             break;
  32.         case 6:
  33.             temp = 0x0D07;
  34.             break;
  35.         case 7:
  36.             temp = 0x0700;
  37.             break;
  38.         case 8:
  39.             temp = 0x0F07;
  40.             break;
  41.         case 9:
  42.             temp = 0x0F03;
  43.             break;
  44.         default:
  45.             break;
  46.         
  47.     }
  48.     switch(pos)
  49.     {
  50.         case 0:
  51.             lcdrambuffer[0] &= 0xFFFF0008;
  52.             lcdrambuffer[0] |= temp;
  53.             Lcd_WriteRam(0,lcdrambuffer[0]);
  54.             break;
  55.         case 1:
  56.             lcdrambuffer[0] &= 0x0008FFFF;
  57.             lcdrambuffer[0] |= ((temp<<16)&0xFFFF0000);
  58.             Lcd_WriteRam(0,lcdrambuffer[0]);
  59.             break;
  60.         case 2:
  61.             lcdrambuffer[1] &= 0xFFFF0008;
  62.             lcdrambuffer[1] |= temp;
  63.             Lcd_WriteRam(1,lcdrambuffer[1]);
  64.             break;
  65.         case 3:
  66.             lcdrambuffer[1] &= 0x0008FFFF;
  67.             lcdrambuffer[1] |= ((temp<<16)&0xFFFF0000);
  68.             Lcd_WriteRam(1,lcdrambuffer[1]);
  69.             break;
  70.         default:
  71.             break;
  72.     }
  73.     #else
  74.     uint8_t temp[4] = {0};
  75.     switch(num)
  76.     {
  77.         case 0:
  78.             temp[0] = 0x03;
  79.             temp[1] = 0x02;
  80.             temp[2] = 0x03;
  81.             temp[3] = 0x02;
  82.             break;
  83.         case 1:
  84.             temp[0] = 0x00;
  85.             temp[1] = 0x02;
  86.             temp[2] = 0x02;
  87.             temp[3] = 0x00;
  88.             break;
  89.         case 2:
  90.             temp[0] = 0x02;
  91.             temp[1] = 0x03;
  92.             temp[2] = 0x01;
  93.             temp[3] = 0x02;
  94.             break;
  95.         case 3:
  96.             temp[0] = 0x02;
  97.             temp[1] = 0x03;
  98.             temp[2] = 0x02;
  99.             temp[3] = 0x02;
  100.             break;
  101.         case 4:
  102.             temp[0] = 0x01;
  103.             temp[1] = 0x03;
  104.             temp[2] = 0x02;
  105.             temp[3] = 0x00;
  106.             break;
  107.         case 5:
  108.             temp[0] = 0x03;
  109.             temp[1] = 0x01;
  110.             temp[2] = 0x02;
  111.             temp[3] = 0x02;
  112.             break;
  113.         case 6:
  114.             temp[0] = 0x03;
  115.             temp[1] = 0x01;
  116.             temp[2] = 0x03;
  117.             temp[3] = 0x02;
  118.             break;
  119.         case 7:
  120.             temp[0] = 0x02;
  121.             temp[1] = 0x02;
  122.             temp[2] = 0x02;
  123.             temp[3] = 0x00;
  124.             break;
  125.         case 8:
  126.             temp[0] = 0x03;
  127.             temp[1] = 0x03;
  128.             temp[2] = 0x03;
  129.             temp[3] = 0x02;
  130.             break;
  131.         case 9:
  132.             temp[0] = 0x03;
  133.             temp[1] = 0x03;
  134.             temp[2] = 0x02;
  135.             temp[3] = 0x02;
  136.             break;
  137.         default:
  138.             break;
  139.     }
  140.     lcdrambuffer[0] &= ~(3<<(pos*2));
  141.     lcdrambuffer[0] |= (temp[0]<<(pos*2));
  142.     lcdrambuffer[1] &= ~(3<<(pos*2));
  143.     lcdrambuffer[1] |= (temp[1]<<(pos*2));
  144.     lcdrambuffer[2] &= ~(3<<(pos*2));
  145.     lcdrambuffer[2] |= (temp[2]<<(pos*2));
  146.     lcdrambuffer[3] &= ~(2<<(pos*2));
  147.     lcdrambuffer[3] |= (temp[3]<<(pos*2));
  148.     Lcd_WriteRam(0,lcdrambuffer[0]);
  149.     Lcd_WriteRam(1,lcdrambuffer[1]);
  150.     Lcd_WriteRam(2,lcdrambuffer[2]);
  151.     Lcd_WriteRam(3,lcdrambuffer[3]);
  152.     #endif
  153. }
  154. void lcdshowdot(uint8_t dotpos,uint8_t show)
  155. {
  156.     if(dotpos > 3)
  157.         return;
  158.     #if(LCD_MODE == 0)
  159.     switch(dotpos)
  160.     {
  161.         case 0:
  162.             if(show > 0)
  163.                 lcdrambuffer[0] |= 0x00000008;
  164.             else
  165.                 lcdrambuffer[0] &= 0xFFFFFFF7;
  166.             Lcd_WriteRam(0,lcdrambuffer[0]);
  167.             break;
  168.         case 1:
  169.             if(show > 0)
  170.                 lcdrambuffer[0] |= 0x00080000;
  171.             else
  172.                 lcdrambuffer[0] &= 0xFFF7FFFF;
  173.             Lcd_WriteRam(0,lcdrambuffer[0]);
  174.             break;
  175.         case 2:
  176.             if(show > 0)
  177.                 lcdrambuffer[1] |= 0x00000008;
  178.             else
  179.                 lcdrambuffer[1] &= 0xFFFFFFF7;
  180.             Lcd_WriteRam(1,lcdrambuffer[1]);
  181.             break;
  182.         case 3:
  183.             if(show > 0)
  184.                 lcdrambuffer[1] |= 0x00080000;
  185.             else
  186.                 lcdrambuffer[1] &= 0xFFF7FFFF;
  187.             Lcd_WriteRam(1,lcdrambuffer[1]);
  188.             break;
  189.         default:
  190.             break;
  191.     }
  192.     #else
  193.     if(show > 0)
  194.         lcdrambuffer[3] |= (1<<(dotpos*2));
  195.     else
  196.         lcdrambuffer[3] &= ~(1<<(dotpos*2));
  197.     Lcd_WriteRam(3,lcdrambuffer[3]);
  198.     #endif
  199. }
timer0修改为10ms,中断处理
  1. uint16_t timecount = 0;
  2. uint8_t showseconddot = 1;
  3. uint8_t timerrun = 0;
  4. void Tim0_IRQHandler(void)
  5. {
  6.     //Timer0 模式0 溢出中断
  7.     if(TRUE == Bt_GetIntFlag(TIM0, BtUevIrq))
  8.     {
  9.         Bt_ClearIntFlag(TIM0,BtUevIrq); //中断标志清零
  10.         if(timerrun == 1)
  11.         {
  12.             if(timecount < 9999)
  13.                 timecount += 1;
  14.             else
  15.             {
  16.                 timecount = 0;
  17.                 //Gpio_WriteOutputIO(STK_LED_PORT, STK_LED_PIN,!Gpio_ReadOutputIO(STK_LED_PORT, STK_LED_PIN));
  18.             }
  19.             lcdshow09num(timecount%10,3);
  20.             lcdshow09num((timecount%100)/10,2);
  21.             lcdshow09num((timecount%1000)/100,1);
  22.             lcdshow09num(timecount/1000,0);
  23.             if(timecount%50 == 0)
  24.             {
  25.                 showseconddot = 1-showseconddot;
  26.                 lcdshowdot(1,showseconddot);
  27.             }
  28.         }
  29.     }
  30. }
按键处理
  1. void PortA_IRQHandler(void)
  2. {
  3.     if(TRUE == Gpio_GetIrqStatus(STK_USER_PORT, STK_USER_PIN))
  4.     {            
  5.         if(Gpio_GetInputIO(STK_USER_PORT, STK_USER_PIN) == FALSE)
  6.         {
  7.             if(timerrun == 0)
  8.             {
  9.                 timecount = 0;
  10.                 showseconddot = 1;
  11.                 lcdshowdot(1,1);
  12.                 timerrun = 1;
  13.             }
  14.             else if(timerrun == 1)
  15.             {
  16.                 timerrun = 2;
  17.             }
  18.             else
  19.             {
  20.                 timerrun = 0;
  21.                 lcdshow09num(0,3);
  22.                 lcdshow09num(0,2);
  23.                 lcdshow09num(0,1);
  24.                 lcdshow09num(0,0);
  25.                 lcdshowdot(1,0);
  26.             }
  27.         }
  28.         Gpio_ClearIrq(STK_USER_PORT, STK_USER_PIN);   
  29.     }
  30. }
运行效果
WeChat_20230808083004 00_00_00-00_00_30.gif

6.2WDT看门狗测试
WDT(Watch Dog Timer)看门狗定时器可用来检测和解决由软件错误引起的故障。当 WDT计数器达到设定的溢出时间后,会触发中断或产生系统复位,WDT由专用的10KHz片内振荡器驱动。
QQ截图20230808111421.png
开启看门狗并配置好时间,看门狗复位模式

  1. void wdt_init()
  2. {
  3.     Sysctrl_SetPeripheralGate(SysctrlPeripheralWdt,TRUE);
  4.     Wdt_Init(WdtResetEn, WdtT1s64);
  5.     Wdt_Start();
  6. }
LCD自动计数,在主循环中定时喂狗,按键按下阻塞住,超时后系统会复位,LCD计数从0开始
  1. int32_t main(void)
  2. {
  3.     xth_init();
  4.     //时钟分频设置
  5.     Sysctrl_SetHCLKDiv(SysctrlHclkDiv1);
  6.     Sysctrl_SetPCLKDiv(SysctrlPclkDiv1);
  7.     led_init();
  8.     key_init();
  9.     timer0_init();
  10.     lcd_io_init();
  11.     lcd_init();
  12.     Lcd_ClearDisp();             ///< 清屏
  13.     lcdshowdot(2,1);
  14.     timerrun = 0;
  15.     lcdshow09num(0,3);
  16.     lcdshow09num(0,2);
  17.     lcdshow09num(0,1);
  18.     lcdshow09num(0,0);
  19.     lcdshowdot(1,0);
  20.     wdt_init();
  21.     while(1)
  22.     {
  23.         while(Gpio_GetInputIO(STK_USER_PORT, STK_USER_PIN) == FALSE);
  24.         Wdt_Feed();
  25.         yuyy_delay_ms(1000);
  26.     }
  27. }
运行效果
WeChat_20230808083010 00_00_00-00_00_30.gif
再试试看门狗中断

  1. void wdt_init()
  2. {
  3.     Sysctrl_SetPeripheralGate(SysctrlPeripheralWdt,TRUE);
  4.     Wdt_Init(WdtIntEn, WdtT1s64);
  5.     EnableNvic(WDT_IRQn, IrqLevel3, TRUE);
  6.     Wdt_Start();
  7. }

  8. void Wdt_IRQHandler(void)
  9. {
  10.     if(Wdt_GetIrqStatus())
  11.     {
  12.         Wdt_IrqClr();       ///<清除 wdt 中断标记
  13.         Gpio_WriteOutputIO(STK_LED_PORT, STK_LED_PIN,!Gpio_ReadOutputIO(STK_LED_PORT, STK_LED_PIN));
  14.     }
  15. }
运行效果
WeChat_20230808083514 00_00_00-00_00_30.gif

6.3RTC测试
RTC(Real Time Clock)实时时钟提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整
接下来开启RTC,尝试用串口打印RTC的时间,开启RTC并初始化时间

  1. void rtc_init()
  2. {
  3.     stc_rtc_initstruct_t RtcInitStruct;
  4.     Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc,TRUE);//RTC模块时钟打开
  5.     RtcInitStruct.rtcAmpm = RtcPm;                       //24小时制
  6.     RtcInitStruct.rtcClksrc = RtcClkXth1024;             //外部32M晶振
  7.     RtcInitStruct.rtcPrdsel.rtcPrdsel = RtcPrdx;         //周期中断类型PRDX
  8.     RtcInitStruct.rtcPrdsel.rtcPrdx = 1u;                //周期中断时间间隔 1秒
  9.     RtcInitStruct.rtcTime.u8Second = 0x55;               //配置RTC时间
  10.     RtcInitStruct.rtcTime.u8Minute = 0x01;
  11.     RtcInitStruct.rtcTime.u8Hour   = 0x09;
  12.     RtcInitStruct.rtcTime.u8Day    = 0x08;
  13.     RtcInitStruct.rtcTime.u8DayOfWeek = 0x02;
  14.     RtcInitStruct.rtcTime.u8Month  = 0x08;
  15.     RtcInitStruct.rtcTime.u8Year   = 0x23;
  16.     RtcInitStruct.rtcCompen = RtcCompenEnable;           // 使能时钟误差补偿
  17.     RtcInitStruct.rtcCompValue = 0;                      //补偿值  根据实际情况进行补偿
  18.     Rtc_Init(&RtcInitStruct);
  19.     Rtc_AlmIeCmd(TRUE);                                  //使能闹钟中断
  20.    
  21.     EnableNvic(RTC_IRQn, IrqLevel3, TRUE);               //使能RTC中断向量
  22.     Rtc_Cmd(TRUE);                                       //使能RTC开始计数
  23. }
RTC中断处理
  1. void print_rtc()
  2. {
  3.     stc_rtc_time_t readtime;
  4.     printf("RTC:%02X年%02X月%02X日 星期%02X %02X:%02X:%02X",readtime.u8Year,readtime.u8Month,readtime.u8Day,readtime.u8DayOfWeek,readtime.u8Hour,readtime.u8Minute,readtime.u8Second);
  5. }

  6. void Rtc_IRQHandler(void)
  7. {
  8.     if(Rtc_GetPridItStatus() == TRUE)
  9.     {
  10.         Rtc_ClearPrdfItStatus();             //清除中断标志位
  11.         print_rtc();
  12.     }
  13. }
运行效果
QQ截图20230808091405.png
串口修改时间

  1. void set_rtc()
  2. {
  3.     if(uart_rxlen > 5)
  4.     {
  5.         stc_rtc_time_t settime;
  6.         settime.u8Year = uart_buffer[0];
  7.         settime.u8Month = uart_buffer[1];
  8.         settime.u8Day = uart_buffer[2];
  9.         settime.u8DayOfWeek = uart_buffer[3];
  10.         settime.u8Hour = uart_buffer[4];
  11.         settime.u8Minute = uart_buffer[5];
  12.         settime.u8Second = uart_buffer[6];
  13.         Rtc_SetTime(&settime);
  14.     }
  15.     uart_rxlen = 0;
  16.     uart_rxindex = 0;
  17. }
  18. void uart_rxtimeout()
  19. {
  20.     set_rtc();
  21. }
运行效果
QQ截图20230808092142.png
用12864LCD做一个带日期显示的电子时钟

  1. void time_chars_init()
  2. {
  3.         Spi_SetCS(M0P_SPI0, FALSE);
  4.     yuyy_hs12864g18b_display_string_8x16(&hs12864_ctr,0,0,0,(uint8_t *)"HC32L196PCTA RTC");
  5.     yuyy_hs12864g18b_display_string_8x16(&hs12864_ctr,0,6,0,(uint8_t *)"Code by yuyy1989");
  6.     yuyy_hs12864g18b_display_graphic_16x16(&hs12864_ctr,0,2,16,(uint8_t *)time_chars[7]);
  7.     yuyy_hs12864g18b_display_graphic_16x16(&hs12864_ctr,0,2,48,(uint8_t *)time_chars[8]);
  8.     yuyy_hs12864g18b_display_graphic_16x16(&hs12864_ctr,0,2,80,(uint8_t *)time_chars[0]);
  9.     yuyy_hs12864g18b_display_graphic_16x16(&hs12864_ctr,0,2,98,(uint8_t *)time_chars[9]);
  10. }
  11. void print_rtc()
  12. {
  13.     char out[20];
  14.     stc_rtc_time_t readtime;
  15.     Rtc_ReadDateTime(&readtime);
  16.     Spi_SetCS(M0P_SPI0, FALSE);
  17.     sprintf(out,"%02X",readtime.u8Year);
  18.     yuyy_hs12864g18b_display_string_8x16(&hs12864_ctr,0,2,0,(uint8_t *)out);
  19.     sprintf(out,"%02X",readtime.u8Month);
  20.     yuyy_hs12864g18b_display_string_8x16(&hs12864_ctr,0,2,32,(uint8_t *)out);
  21.     sprintf(out,"%02X",readtime.u8Day);
  22.     yuyy_hs12864g18b_display_string_8x16(&hs12864_ctr,0,2,64,(uint8_t *)out);
  23.     yuyy_hs12864g18b_display_graphic_16x16(&hs12864_ctr,0,2,114,(uint8_t *)time_chars[readtime.u8DayOfWeek]);
  24.     sprintf(out,"%02X:%02X:%02X",readtime.u8Hour,readtime.u8Minute,readtime.u8Second);
  25.     yuyy_hs12864g18b_display_string_8x16(&hs12864_ctr,0,4,32,(uint8_t *)out);
  26.     Spi_SetCS(M0P_SPI0, TRUE);
  27. }
运行效果
WeChat_20230808100056 00_00_00-00_00_30.gif

6.4FLASH测试
HC32L196内部集成了256K的flash,每块 FLASH 按照Sector进行划分,每个Sector容量为512字节
做个简单的程序测试一下,按下按键时生成一个0-9999的随机数,用段码LCD显示并存储到FLASH,系统初始化时读出存储的数字并放到LCD上显示

  1. #define FLASH_ADDR 0x1FE00
  2. void flash_init()
  3. {
  4.     while(Ok != Flash_Init(8, TRUE))
  5.     {
  6.         while(1);
  7.     }
  8. }

  9. void read_data_from_flash()
  10. {
  11.     Flash_LockSet(FlashLock1, 0x80000000);
  12.     while(Ok != Flash_OpModeConfig(FlashReadMode));
  13.     testdata = *((unsigned short int *)FLASH_ADDR);
  14.     Flash_LockAll();
  15.     show_testdata();
  16. }

  17. void write_data_to_flash()
  18. {
  19.     Flash_LockSet(FlashLock1, 0x80000000);
  20.     while(Ok != Flash_OpModeConfig(FlashSectorEraseMode));
  21.     if(Ok != Flash_SectorErase(FLASH_ADDR))
  22.     {
  23.         while(1);
  24.     }
  25.     ///< FLASH 字节写、校验
  26.     while(Ok != Flash_OpModeConfig(FlashWriteMode));
  27.     if (Ok != Flash_Write16(FLASH_ADDR, &testdata, 1))
  28.     {
  29.         while(1);
  30.     }
  31.     Flash_LockAll();
  32. }
按键按下生成随机数并保存
  1. void PortA_IRQHandler(void)
  2. {
  3.     if(TRUE == Gpio_GetIrqStatus(STK_USER_PORT, STK_USER_PIN))
  4.     {           
  5.         Gpio_ClearIrq(STK_USER_PORT, STK_USER_PIN);         
  6.         if(Gpio_GetInputIO(STK_USER_PORT, STK_USER_PIN) == FALSE)
  7.         {
  8.             Gpio_WriteOutputIO(STK_LED_PORT, STK_LED_PIN,!Gpio_ReadOutputIO(STK_LED_PORT, STK_LED_PIN));
  9.             Trng_Generate();
  10.             testdata = Trng_GetData0()%10000;
  11.             show_testdata();
  12.             write_data_to_flash();
  13.         }  
  14.     }
  15. }

运行效果
WeChat_20230808110410 00_00_00-00_00_30.gif

yang377156216 发表于 2023-8-8 18:19 | 显示全部楼层
段码LCD 的型号应该是:大连佳显电子的 GDC04212 吧。
 楼主| yuyy1989 发表于 2023-8-8 18:25 | 显示全部楼层
yang377156216 发表于 2023-8-8 18:19
段码LCD 的型号应该是:大连佳显电子的 GDC04212 吧。

对,原理图上有标
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

168

主题

826

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部