野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 750|回复: 1

【野火】瑞萨RA MCU创意氛围赛+智能门锁

[复制链接]
发表于 2023-8-21 18:13:30 | 显示全部楼层 |阅读模式
本帖最后由 samuraiiisword 于 2023-8-21 22:28 编辑

一、背景
    本项目主要设计一个门锁系统,通过板载ESP8266网络将验证码发送至云端,用户通过手机上接受到的验证码打开门锁。
二、设计
(一)硬件设计

    绘制拓展板时计划使用到液晶屏,摄像头和指纹模块,扬声器等外设,所以绘制PCB时都加上去了,改了两次板后依旧还有些硬件问题没解决,加上软件没调好,目前只能通过使用触摸屏来驱动舵机。图中的GD32f103芯片打算作为摄像头OV7670和液晶屏的中转,由于我使用的OV7670不带缓存,故打算用GD32将16位的图像数据通过8080时序直接传输给LCD,目前还没调通该部分。
(二)软件设计

    该系统中主要使用到了timer控制舵机完成开门和及时关门的操作,使用RNG寄存器实现得到随机的开锁密码,通过ESP8266传输给手机设备,使用RTC更新当前时间。
三、实现
(一)ESP8266
        该模块使用Arduino软件进行编程,主要功能为获取时间和MQTT协议通讯,具体代码如下:
  1. #include <NTPClient.h>
  2. #include <PubSubClient.h>
  3. #include <ESP8266WiFi.h>
  4. #include <WiFiUdp.h>
  5. #include <String.h>

  6. const char *ssid     = "CMCC-416";//
  7. const char *password = "12345678";//
  8. const char* mqtt_server = "114.55.65.118";//MQTT服务器地址


  9. char msg[200];
  10. int msg_ind=0;

  11. WiFiUDP ntpUDP;
  12. NTPClient timeClient(ntpUDP, "ntp1.aliyun.com", 60*60*8, 30*60*1000);

  13. WiFiClient espClient;
  14. PubSubClient client(espClient);

  15. void setup(){
  16.   Serial.begin(115200);
  17.   WiFi.begin(ssid, password);

  18.   while ( WiFi.status() != WL_CONNECTED ) {
  19.     delay ( 500 );
  20.     Serial.print ( "." );
  21.   }

  22.   client.setServer(mqtt_server, 1883);//设置MQTT服务器和端口号
  23.   client.setCallback(callback);   //设置MQTT回传函数
  24.   timeClient.begin();
  25.   while (!client.connect("ESP8266Client")) {
  26.     Serial.print ( "-" );
  27.     delay ( 500 );
  28.   }//以ESP8266Client身份连接MQTT服务器
  29.   Serial.print ("MQTTsuccess" );
  30.   client.subscribe("RA6M5/1");
  31. }

  32. void callback(char* topic, byte* payload, unsigned int length) {
  33.   if (strstr((char*)payload,(char*)"askInfo")!=NULL)//从单片机中获取当前信息
  34.   {
  35.     Serial.print("ANDROID_ASKINFO\n");
  36.   }
  37. }

  38. void loop() {
  39.   client.loop();//循环调用回传函数,当订阅的主题有新消息时能马上进入callback函数
  40.   while(Serial.available()>0)//读取串口
  41.   {
  42.     char recvData =  Serial.read();
  43.     msg[msg_ind++] = recvData;//逐个字符写入串口接收缓存区
  44.     delay(100);
  45.     if (recvData=='\n'){
  46. //      Serial.print("Time:");
  47. //      Serial.print(msg);
  48.       if (strstr(msg,(char*)"{"))//当串口接受的最后一个字符是'\n'结尾时,对所有缓存区域进行处理
  49.       {
  50.         if (client.connect("ESP8266Client")) {//以ESP8266Client身份连接MQTT服务器
  51.           client.publish("RA6M5/2", msg,msg_ind-1);   //将缓存区数据以RA6M5/2主题发布
  52.         }
  53.         msg_ind=0;//刷新串口接收缓存
  54.       }
  55.       else if (strstr(msg,(char*)"GETTIME")){
  56.         timeClient.update();
  57.         //获取时间戳
  58.         //unsigned long epochTime = timeClient.getFormattedTime();
  59.         Serial.print("Time:");
  60.         Serial.println(timeClient.getEpochTime());
  61.         msg_ind=0;//刷新串口接收缓存
  62.       }
  63.       else if (strstr(msg,(char*)"WIFISTATE")){
  64.         if ( WiFi.status() == WL_CONNECTED ) {
  65.           int rss=WiFi.RSSI();
  66.           if (rss<=0&&rss>=-50)
  67.             Serial.println ( "WIFI:3" );
  68.           else if (rss<=-50&&rss>=-70)
  69.             Serial.println ( "WIFI:2" );
  70.           else if (rss<=-70&&rss>=-80)
  71.             Serial.println ( "WIFI:1" );
  72.           else if (rss<=-80&&rss>=-100)
  73.             Serial.println ( "WIFI:0" );
  74.         }else{
  75.           Serial.println ( "WIFI:No" );
  76.         }
  77.       }
  78.     }
  79.   }
  80. }
复制代码
(二)上位机部分

        该部分使用Android Studio编写,主要代码如下:
  1. public class MainActivity extends AppCompatActivity {
  2.     private static IntentFilter action;
  3.     RecyclerView recycler;

  4.     private final String payloadJson1="{"ParkingState":1}";

  5.     final int POST_DEVICE_PROPERTIES_SUCCESS = 1002;
  6.     final int POST_DEVICE_PROPERTIES_ERROR = 1003;
  7.     final int UPDATE_UI = 1004;
  8.     private MqttClient mqttClient=null;
  9.     private String responseBody = "";
  10.     private static final String TAG =MainActivity.class.getSimpleName();
  11.     private ArrayList<dataBean> datas = new ArrayList<>();
  12.     private String temper_str="未知";
  13.     private String humdity_str="未知";
  14.     private String passwd_str="未知";
  15.     private dataBean bean = new dataBean();

  16.     MyAdapter adapter;

  17.     private Handler mHandler = new Handler() {
  18.         @Override
  19.         public void handleMessage(Message msg) {
  20.             switch (msg.what) {
  21.                 case POST_DEVICE_PROPERTIES_SUCCESS:
  22.                     showToast("发送数据成功");
  23.                     break;
  24.                 case POST_DEVICE_PROPERTIES_ERROR:
  25.                     showToast("post数据失败");
  26.                     break;
  27.                 case UPDATE_UI:
  28.                     SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd\nHH:mm:ss");
  29.                     Date curDate = new Date(System.currentTimeMillis());
  30.                     String str_time = formatter.format(curDate);
  31.                     datas.clear();
  32.                     bean = new dataBean("湿度",humdity_str,str_time,getResources().getDrawable(R.drawable.ic_humdity, null));
  33.                     datas.add(bean);
  34.                     bean = new dataBean("温度",temper_str,str_time,getResources().getDrawable(R.drawable.ic_temperature, null));
  35.                     datas.add(bean);
  36.                     bean = new dataBean("验证码",passwd_str,str_time,getResources().getDrawable(R.drawable.ic_temperature, null));
  37.                     datas.add(bean);
  38.                     adapter.notifyDataSetChanged();
  39.                     break;

  40.             }
  41.         }
  42.     };


  43.     @Override
  44.     protected void onCreate(Bundle savedInstanceState) {
  45.         super.onCreate(savedInstanceState);
  46.         setContentView(R.layout.activity_main);

  47.         recycler = findViewById(R.id.recyclerView);

  48.         RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout);
  49.         refreshLayout.setRefreshHeader(new ClassicsHeader(this));
  50.         refreshLayout.setRefreshFooter(new ClassicsFooter(this));
  51.         refreshLayout.setOnRefreshListener(new OnRefreshListener() {
  52.             @Override
  53.             public void onRefresh(RefreshLayout refreshlayout) {
  54.                 refreshlayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败
  55.                 mHandler.postDelayed(() -> postDeviceProperties1(), 1000);
  56.             }
  57.         });
  58.         refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
  59.             @Override
  60.             public void onLoadMore(RefreshLayout refreshlayout) {
  61.                 refreshlayout.finishLoadMore(2000/*,false*/);//传入false表示加载失败
  62.                 mHandler.postDelayed(() -> postDeviceProperties1(), 1000);
  63.             }
  64.         });

  65.         new Thread(() -> initMQTTClient()).start();

  66.         SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd\nHH:mm:ss");
  67.         Date curDate = new Date(System.currentTimeMillis());
  68.         String str_time = formatter.format(curDate);

  69.         bean = new dataBean("湿度",temper_str,str_time,getResources().getDrawable(R.drawable.ic_humdity, null));
  70.         datas.add(bean);
  71.         bean = new dataBean("温度",humdity_str,str_time,getResources().getDrawable(R.drawable.ic_temperature, null));
  72.         datas.add(bean);
  73.         bean = new dataBean("验证码",passwd_str,str_time,getResources().getDrawable(R.drawable.ic_temperature, null));
  74.         datas.add(bean);


  75.         //适配器
  76.         adapter = new MyAdapter(this, datas);
  77.         //布局
  78.         LinearLayoutManager manager = new LinearLayoutManager(this);
  79.         //设置布局
  80.         recycler.setLayoutManager(manager);
  81.         //设置动画
  82.         recycler.setItemAnimator(new DefaultItemAnimator());
  83.         //设置适配器
  84.         recycler.setAdapter(adapter);


  85.     }

  86.     private void initMQTTClient() {

  87.         try {
  88.             // cn-shanghai
  89.             String targetServer ="tcp://114.55.65.118:1883";
  90.             String mqttclientId = "RA6M5_Android1";
  91.             String mqttUsername = "RA6M5_Android_User1";
  92.             String mqttPassword = "123456";
  93.             connectMqtt(targetServer, mqttclientId, mqttUsername, mqttPassword);
  94.         } catch (Exception e) {
  95.             e.printStackTrace();
  96.             responseBody = e.getMessage();
  97.             mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_ERROR);
  98.         }
  99.     }

  100.     public void connectMqtt(String url, String clientId, String mqttUsername, String mqttPassword) throws Exception {

  101.         MemoryPersistence persistence = new MemoryPersistence();
  102.         mqttClient = new MqttClient(url, clientId, persistence);
  103.         MqttConnectOptions connOpts = new MqttConnectOptions();
  104.         // MQTT 3.1.1
  105.         connOpts.setMqttVersion(4);
  106.         connOpts.setAutomaticReconnect(true);
  107.         connOpts.setCleanSession(true);

  108.         connOpts.setUserName(mqttUsername);
  109.         connOpts.setPassword(mqttPassword.toCharArray());
  110.         connOpts.setKeepAliveInterval(60);

  111.         mqttClient.connect(connOpts);
  112.         mqttClient.setCallback(new MqttCallback() {
  113.             @Override
  114.             public void connectionLost(Throwable cause) {
  115.                 Log.e(TAG, "cause ---> " + cause);
  116.             }

  117.             @Override
  118.             public void messageArrived(String topic, MqttMessage message) throws Exception {
  119.                 Log.e(TAG, "topic ---> " + topic + "       message--->" + message);
  120.                 if (topic.equals("RA6M5/2")){
  121.                     String mqtt_str = new String(message.getPayload());
  122.                     JSONObject json = new JSONObject(mqtt_str);
  123.                     temper_str = json.getString("temper");
  124.                     humdity_str = json.getString("humdity");
  125.                     passwd_str = json.getString("passwd");
  126.                     mHandler.sendEmptyMessage(UPDATE_UI);
  127.                     Log.e(TAG, "update--finish ");

  128.                 }
  129.             }

  130.             @Override
  131.             public void deliveryComplete(IMqttDeliveryToken token) {
  132.                 Log.e(TAG, "token ---> " + token);
  133.             }
  134.         });
  135.         mqttClient.subscribe("RA6M5/2");
  136.         Log.d(TAG, "connected " + url);
  137.     }

  138.     private void showToast(String msg) {
  139.         Toast.makeText(MainActivity.this, msg,Toast.LENGTH_SHORT).show();
  140.     }

  141.     private void postDeviceProperties1() {
  142.         try {

  143.             Random random = new Random();

  144.             //上报数据
  145.             String payload = "askInfo";
  146.             responseBody = payload;
  147.             MqttMessage message = new MqttMessage(payload.getBytes("utf-8"));
  148.             message.setQos(1);

  149.             String pubTopic = "RA6M5/1";
  150.             mqttClient.publish(pubTopic, message);
  151.             Log.d(TAG, "publish topic=" + pubTopic + ",payload=" + payload);
  152.             mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_SUCCESS);
  153.         } catch (Exception e) {
  154.             e.printStackTrace();
  155.             responseBody = e.getMessage();
  156.             mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_ERROR);
  157.             Log.e(TAG, "postDeviceProperties error " + e.getMessage(), e);
  158.         }
  159.     }
  160. }
复制代码

(三)单片机部分
        该部分使用Android Studio编写,主要代码如下:

          1)屏幕显示部分
  1. void LCD_thread_entry(void * pvParameters)
  2. {
  3.                 uint32_t lValueToRece;
  4.                 uint16_t pos_x=0,pos_y=0;
  5.                 EventBits_t Eventbits;
  6.                 BaseType_t err = pdFALSE;
  7.                 unsigned char touch_vals[4];
  8.                 unsigned char touch_tmp=0;
  9.                 xEventGroupClearBits(g_new_event_LCD,0x7);
  10.                 xEventGroupSetBits(g_new_event_LCD,0x1);
  11.                 FSP_PARAMETER_NOT_USED(pvParameters);
  12.                 R_IOPORT_Open(&g_ioport_ctrl, g_ioport.p_cfg);
  13.                 LCD_Init();
  14.                 WIFI_Init();
  15.                 PWM_Init();
  16.                 R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);
  17.                 R_GPT_Start(&g_timer0_ctrl);
  18.                 R_GPT_Disable(&g_timer0_ctrl);
  19.                 LCD_Clean(BLUE);//BLUE
  20.                 Draw_Square_Back(18,180,100,56,BRRED,LIGHTBLUE,array_renlian);
  21.                 Draw_Square_Back(18,240,100,56,BRRED,LIGHTBLUE,array_mima);
  22. //                LCD_ShowPic(18,180,27,40,gImage_temp,BLUE);
  23. //                LCD_ShowPic(18,240,27,40,gImage_humdity,BLUE);
  24.                 R_SCI_UART_Write(&g_uart9_wifi_ctrl, (const uint8_t*)"GETTIME\n", 8);
  25.                 mbedtls_platform_setup(&ctx);
  26.                 RM_PSA_CRYPTO_TRNG_Read(passwd_Byte+6,6,&passwd_num);
  27.                 /* TODO: add your own code here */
  28.                 while(1)
  29.                 {
  30.                         Eventbits = xEventGroupGetBits(g_new_event_LCD);
  31.                         if ((Eventbits&0x1)==0x1){//显示时间
  32.                                 //更新wifi数据
  33.                                 wifi_analysis();
  34.                                 DHT11_Read();
  35.                                 err = xQueueReceive(g_touch_queue,&lValueToRece,20);               
  36.                                 if (err==pdTRUE){
  37.                                                 pos_x = lValueToRece>>16;
  38.                                                 pos_y = lValueToRece & 0xffff;
  39.                                                 if ((pos_x>18)&&(pos_x<118))
  40.                                                 {
  41.                                                         if ((pos_y>180)&&(pos_y<236))
  42.                                                         {
  43.                                                                 taskENTER_CRITICAL();
  44.                                                                 LCD_Fill(0,0,239,319,WHITE);//BLUE
  45.                                                                 taskEXIT_CRITICAL();
  46.                                                         }else if ((pos_y>240)&&(pos_y<316))
  47.                                                         {
  48.                                                                 xSemaphoreGive(g_rtc_binSem);
  49.                                                                 xEventGroupClearBits(g_new_event_LCD,0x7);
  50.                                                                 xEventGroupSetBits(g_new_event_LCD,0x4);
  51.                                                                 taskENTER_CRITICAL();
  52.                                                                 LCD_Fill(0,0,239,319,WHITE);//BLUE
  53.                                                                 LCD_Disp_KeyBoard();
  54.                                                                 getKeyBoardTRNG();
  55.                                                                 taskEXIT_CRITICAL();
  56.                                                         }
  57.                                                 }
  58.                                 }
  59.                         }else if((Eventbits&0x4)==0x4){
  60.                                 
  61.                                 err = xQueueReceive(g_touch_queue,&lValueToRece,20);
  62.                                 if (err==pdTRUE){
  63.                                         touch_tmp  = LCD_Read_KeyBoard((unsigned short)(lValueToRece>>16),lValueToRece&0xffff);
  64.                                         if (touch_tmp==0xff){
  65.                                                 minLCD_Key_Loc();
  66.                                         }else if (touch_tmp<10)
  67.                                         {
  68.                                                 if (getLCD_Key_Loc()>0)
  69.                                                 touch_vals[getLCD_Key_Loc()-1] = touch_tmp;
  70.                                         }
  71.                                         LCD_Disp_Passwd(touch_vals,getLCD_Key_Loc());
  72.                                         if (getLCD_Key_Loc()==4)
  73.                                         {
  74.                                                 //校验
  75.                                                 if ((touch_vals[0]==(passwd_Byte[0]-'0'))
  76.                                                         &&(touch_vals[1]==(passwd_Byte[1]-'0'))
  77.                                                         &&(touch_vals[2]==(passwd_Byte[2]-'0'))
  78.                                                         &&(touch_vals[3]==(passwd_Byte[3]-'0'))
  79.                                                         )
  80.                                                 {
  81.                                                         lockState=false;
  82.                                                         R_GPT_Enable(&g_timer0_ctrl);
  83.                                                         xEventGroupClearBits(g_new_event_LCD,0x7);
  84.                                                         xEventGroupSetBits(g_new_event_LCD,0x1);
  85.                                                         taskENTER_CRITICAL();
  86.                                                         LCD_Fill(0,0,239,319,BLUE);//BLUE
  87.                                                         taskEXIT_CRITICAL();
  88.                                                         xSemaphoreGive(g_flush_semaphore);
  89.                                                         R_SCI_UART_Write(&g_uart9_wifi_ctrl, (const uint8_t*)"GETTIME\n", 8);
  90.                                                 }
  91.                                         }
  92.                                 }
  93.                                 
  94.                         }
  95.                         if (lockState){//关着
  96.                                 PWM_Update(5);
  97.                         }
  98.                         else{
  99.                                 PWM_Update(10);//打开
  100.                         }
  101.                 }
  102. }



  103. void uart9_wifi_callback(uart_callback_args_t * p_args)
  104. {
  105.          switch(p_args->event)
  106.          {
  107.          case UART_EVENT_RX_CHAR:
  108.                                         wifi_rece_buff[wifi_rece_len++] = p_args->data&0xff;
  109.                                         if (p_args->data=='\n'){
  110.                                                 flag_wifi_rece=true;
  111.                                         }                                
  112.             break;
  113.                  case UART_EVENT_TX_COMPLETE:

  114.                         break;
  115.          default:
  116.             break;
  117.      }
  118. }

  119. void lock_timer0_callback(timer_callback_args_t * p_args)
  120. {
  121.         if (TIMER_EVENT_CYCLE_END == p_args->event)
  122.         {
  123.                         lockState=true;
  124.                         R_GPT_Disable(&g_timer0_ctrl);
  125.         }
  126.         
  127. }
复制代码
         2)触摸部分

  1. void Touch_thread_entry(void * pvParameters)
  2. {
  3.                 FSP_PARAMETER_NOT_USED(pvParameters);
  4.                 bool Touch_flag_time=true;
  5.                 bsp_io_level_t state;
  6.                 fsp_err_t err = FSP_SUCCESS;
  7.                 /* Open ICU module */
  8.                 err = R_ICU_ExternalIrqOpen(&g_external_irq4_ctrl, &g_external_irq4_cfg);
  9.                 /* 允许中断 */
  10.                 err = R_ICU_ExternalIrqEnable(&g_external_irq4_ctrl);
  11.                 /* TODO: add your own code here */
  12.                 while(1)
  13.                 {
  14.                         
  15.                         if (flag_touch_start){
  16.                                 if (Touch_num==6){
  17.                                         uint32_t lValueToSend;
  18.                                         flag_touch_start = false;
  19.                                         Touch_coordinate_xsum = Touch_coordinate_xsum-Touch_coordinate_xmax-Touch_coordinate_xmin;
  20.                                         Touch_coordinate_xsum >>=2;
  21.                                         Touch_coordinate_ysum = Touch_coordinate_ysum-Touch_coordinate_ymax-Touch_coordinate_ymin;
  22.                                         Touch_coordinate_ysum >>=2;
  23.                                         Touch_corrdinate_pixel(Touch_coordinate_xsum,Touch_coordinate_ysum);
  24.                                         lValueToSend = Touch_coordinate_xpix;
  25.                                         lValueToSend <<=16;
  26.                                         lValueToSend |= Touch_coordinate_ypix;
  27.                                         xQueueSendToBack(g_touch_queue,&lValueToSend,100000);
  28.                                         Touch_num=0;
  29.                                         vTaskDelay(100);
  30.                                 }else{
  31.                                         taskENTER_CRITICAL();        //进入基本临界区
  32.                                         touch_curr_x = Touch_Write_CMD(READ_CHANNEL_X);
  33.                                         touch_curr_y = Touch_Write_CMD(READ_CHANNEL_Y);
  34.                                         taskEXIT_CRITICAL();
  35.                                         if (Touch_num==0)
  36.                                         {
  37.                                                 Touch_coordinate_xmax=touch_curr_x;
  38.                                                 Touch_coordinate_xmin=touch_curr_x;
  39.                                                 Touch_coordinate_ymax=touch_curr_y;
  40.                                                 Touch_coordinate_ymin=touch_curr_y;
  41.                                                 Touch_coordinate_xsum = touch_curr_x;
  42.                                                 Touch_coordinate_ysum = touch_curr_y;
  43.                                         }else{
  44.                                                 Touch_coordinate_average(touch_curr_x,0);
  45.                                                 Touch_coordinate_average(touch_curr_y,1);
  46.                                         }
  47.                                         Touch_num++;
  48.                                 }
  49.                         }else{
  50.                                 if (Touch_flag_time)
  51.                                         R_IOPORT_PinWrite(&g_ioport_ctrl, LCD_SCK, BSP_IO_LEVEL_LOW);
  52.                                 else
  53.                                         R_IOPORT_PinWrite(&g_ioport_ctrl, LCD_SCK, BSP_IO_LEVEL_HIGH);
  54.                                 R_IOPORT_PinRead(&g_ioport_ctrl, LCD_IRQ, &state);
  55.                                 if (state==BSP_IO_LEVEL_LOW){
  56.                                         flag_touch_start=true;
  57.                                 }
  58.                                 vTaskDelay(10);
  59.                         }       //退出基本临界区
  60.                         vTaskDelay(10);
  61. //                                        xSemaphoreTake(g_touch_binary_semaphore,portMAX_DELAY);
  62.                 }
  63. }
复制代码
         3)RTC部分

  1. void RTC_thread_entry(void * pvParameters)
  2. {
  3.         FSP_PARAMETER_NOT_USED(pvParameters);
  4.         EventBits_t Eventbits;
  5.         BaseType_t err = pdFALSE;
  6.         /* TODO: add your own code here */
  7.         while(1)
  8.         {
  9.                 Eventbits = xEventGroupGetBits(g_new_event_LCD);
  10.                 if ((Eventbits&0x1)==0x1)//显示时间
  11.                 {
  12.                         xSemaphoreTake(g_rtc_binSem,portMAX_DELAY);
  13.                         taskENTER_CRITICAL();
  14.                         Time_Update();
  15.                         taskEXIT_CRITICAL();
  16.                         err = xSemaphoreTake(g_flush_semaphore,20);
  17.                         if (err==pdTRUE)
  18.                         {
  19.                                 taskENTER_CRITICAL();
  20.                                 Draw_Square_Back(18,180,100,56,BRRED,LIGHTBLUE,array_renlian);
  21.                                 Draw_Square_Back(18,240,100,56,BRRED,LIGHTBLUE,array_mima);
  22.                                 taskEXIT_CRITICAL();
  23.                         }
  24.                 }
  25.                 else{
  26.                         if (first_Disp){
  27.                                 LCD_Fill(0,131,239,50,WHITE);
  28.                                 Draw_Square(10,140,60,50,RED,GREEN,4);//4
  29.                                 Draw_Square(90,140,60,50,RED,GREEN,5);//5
  30.                                 Draw_Square(170,140,60,50,RED,GREEN,6);//6
  31.                                 first_Disp--;
  32.                         }
  33.                         vTaskDelay(1000);
  34.                 }
  35.         }
  36. }

  37.                                 
  38. void rtc_lcd_callback(rtc_callback_args_t * p_args)
  39. {
  40.         switch (p_args->event)
  41.           {
  42.                  /*若是周期中断,则更新日期*/
  43.                  case RTC_EVENT_PERIODIC_IRQ:

  44.                         /*获取当前时间*/
  45.                         R_RTC_CalendarTimeGet (g_rtc_lcd.p_ctrl, lcd_time);
  46.                         xSemaphoreGiveFromISR(g_rtc_binSem,NULL);
  47.                         break;
  48.                  default:
  49.                         break;
  50.           }
  51. }
复制代码


四、运行




拓展板原理图

拓展板原理图

寄存器配置

寄存器配置

密码输入界面

密码输入界面

主界面

主界面

APP界面

APP界面
回复

使用道具 举报

发表于 2024-4-1 18:29:55 | 显示全部楼层
作者大大有没有ov7670在ra6m5
上的源码,想跑一下
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-2 08:23 , Processed in 0.029273 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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