11-verilog的RTC驅動代碼

verilog的RTC驅動代碼

1.例化


parameter      SLAVE_ADDR =  7'h51        ;  // 器件地址
parameter      BIT_CTRL   =  1'b0         ;  // 字地址位控制參數(16b/8b)
parameter      CLK_FREQ   = 26'd50_000_000;  // i2c_dri模塊的驅動時鐘頻率(CLK_FREQ)
parameter      I2C_FREQ   = 18'd250_000   ;  // I2C的SCL時鐘頻率
parameter      POINT      = 6'b010100     ;  // 控制點亮數碼管小數點的位置
//初始時間設置,從高到低為年到秒,各占8bit
parameter      TIME_INI   = 48'h18_05_23_09_30_00;
//例化i2c_dri,調用IIC協議i2c_dri #(.SLAVE_ADDR  (SLAVE_ADDR),    // slave address從機地址,放此處方便參數傳遞.CLK_FREQ    (CLK_FREQ  ),    // i2c_dri模塊的驅動時鐘頻率(CLK_FREQ).I2C_FREQ    (I2C_FREQ  )     // I2C的SCL時鐘頻率
) u_i2c_dri(//global clock.clk         (sys_clk   ),    // i2c_dri模塊的驅動時鐘(CLK_FREQ).rst_n       (sys_rst_n ),    // 復位信號//i2c interface.i2c_begin    (i2c_exec  ),    // I2C觸發執行信號.i2c_rw       (i2c_rh_wl ),    // I2C讀寫控制信號.i2c_addr    (i2c_addr  ),    // I2C器件內地址.i2c_data_w  (i2c_data_w),    // I2C要寫的數據.i2c_data_r  (i2c_data_r),    // I2C讀出的數據.i2c_done    (i2c_done  ),    // I 2C一次操作完成.scl         (rtc_scl   ),    // I2C的SCL時鐘信號.sda         (rtc_sda   ),    // I2C的SDA信號//user interface.dri_clk     (clk       )     // I2C操作時鐘
);//例化PCF8563測量模塊
pcf8563 #(.TIME_INI(TIME_INI)
) u_pcf8563(//system clock.clk         (clk       ),    // 時鐘信號.rst_n       (sys_rst_n ),    // 復位信號//i2c interface.i2c_rh_wl   (i2c_rh_wl ),    // I2C讀寫控制信號.i2c_exec    (i2c_exec  ),    // I2C觸發執行信號.i2c_addr    (i2c_addr  ),    // I2C器件內地址.i2c_data_w  (i2c_data_w),    // I2C要寫的數據.i2c_data_r  (i2c_data_r),    // I2C讀出的數據.i2c_done    (i2c_done  ),    // I2C一次操作完成//user interface.key_value   (key_value ),    // 按鍵切換輸入.num         (num       )     // 數碼管要顯示的數據
); 

2.驅動8563

module pcf8563 #(// 初始時間設置,從高到低為年到秒,各占8bitparameter  TIME_INI = 48'h18_01_02_03_04_05)(//system clock 50MHzinput                 clk        ,    // 時鐘信號input                 rst_n      ,    // 復位信號//i2c interfaceoutput   reg          i2c_rh_wl  ,    // I2C讀寫控制信號output   reg          i2c_exec   ,    // I2C觸發執行信號output   reg  [15:0]  i2c_addr   ,    // I2C器件內地址output   reg  [ 7:0]  i2c_data_w ,    // I2C要寫的數據input         [ 7:0]  i2c_data_r ,    // I2C讀出的數據input                 i2c_done   ,    // I2C一次操作完成//user interfaceinput                 key_value  ,    // 按鍵切換輸入output        [23:0]  num             // 數碼管要顯示的數據
);//reg define
reg            key_dy0   ;                // 延遲打拍
reg            key_dy1   ;                // 延遲打拍
reg            switch    ;                // 按鍵切換顯示日期、時間
reg   [3:0]    flow_cnt  ;                // 狀態流控制
reg  [20:0]    wait_cnt  ;                // 計數等待//PCF8563T的秒、分、時、日、月、年數據
reg   [7:0]    sec       ;                // 秒
reg   [7:0]    min       ;                // 分
reg   [7:0]    hour      ;                // 時
reg   [7:0]    day       ;                // 日
reg   [7:0]    mon       ;                // 月
reg   [7:0]    year      ;                // 年
wire  [23:0]   rtc_time  ;                // 時間,從低位到高位依次是秒、分、時,各8bit
wire  [23:0]   rtc_date  ;                // 日期,從低位到高位依次是日、月、年,各8bit//wire define
wire           neg_sap   ;                // 采下降沿得到的信號//*****************************************************
//**                    main code
//*****************************************************assign neg_sap  = (~key_dy0 & key_dy1);   // 按鍵按下時,得到一個周期的高電平信號
assign rtc_time = {hour,min,sec};
assign rtc_date = {year,mon,day};
//通過switch切換時間/日期顯示
assign num      = switch ? rtc_time : rtc_date;//打拍(采按鍵時的下降沿)
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginkey_dy0  <= 1'b1;key_dy1  <= 1'b1;endelse beginkey_dy0 <= key_value;key_dy1 <= key_dy0  ;end
end//按鍵切換
always @(posedge clk or negedge rst_n ) beginif(!rst_n)switch<= 1'b0;else if (neg_sap)switch <= ~switch;
end//從PCF8563T讀出的時間、日期數據
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginsec        <= 8'h0;min        <= 8'h0;hour       <= 8'h0;day        <= 8'h0;mon        <= 8'h0;year       <= 8'h0;i2c_exec   <= 1'b0;i2c_rh_wl  <= 1'b0;i2c_addr   <= 8'd0;i2c_data_w <= 8'd0;flow_cnt   <= 4'd0;wait_cnt   <= 21'd0;endelse begini2c_exec <= 1'b0;case(flow_cnt)//上電初始化4'd0: beginif(wait_cnt == 21'd1_000_000) beginwait_cnt<= 21'd0;flow_cnt<= flow_cnt + 1'b1;endelsewait_cnt<= wait_cnt + 1'b1;end//寫讀秒4'd1: begini2c_exec  <= 1'b1;i2c_addr  <= 8'h02;flow_cnt  <= flow_cnt + 1'b1;i2c_data_w<= TIME_INI[7:0];end4'd2: beginif(i2c_done == 1'b1) beginsec     <= i2c_data_r[6:0];flow_cnt<= flow_cnt + 1'b1;endend//寫讀分4'd3: begini2c_exec  <= 1'b1;i2c_addr  <= 8'h03;flow_cnt  <= flow_cnt + 1'b1;i2c_data_w<= TIME_INI[15:8];end4'd4: beginif(i2c_done == 1'b1) beginmin     <= i2c_data_r[6:0];flow_cnt<= flow_cnt + 1'b1;endend//寫讀時4'd5: begini2c_exec  <= 1'b1;i2c_addr  <= 8'h04;flow_cnt  <= flow_cnt + 1'b1;i2c_data_w<= TIME_INI[23:16];end4'd6: beginif(i2c_done == 1'b1) beginhour    <= i2c_data_r[5:0];flow_cnt<= flow_cnt + 1'b1;endend//寫讀天4'd7: begini2c_exec  <= 1'b1;i2c_addr  <= 8'h05;flow_cnt  <= flow_cnt + 1'b1;i2c_data_w<= TIME_INI[31:24];end4'd8: beginif(i2c_done == 1'b1) beginday     <= i2c_data_r[5:0];flow_cnt<= flow_cnt + 1'b1;endend//寫讀月4'd9: begini2c_exec  <= 1'b1;i2c_addr  <= 8'h07;flow_cnt  <= flow_cnt + 1'b1;i2c_data_w<= TIME_INI[39:32];end4'd10: beginif(i2c_done == 1'b1) beginmon     <= i2c_data_r[4:0];flow_cnt<= flow_cnt + 1'b1;endend//寫讀年4'd11: begini2c_exec  <= 1'b1;i2c_addr  <= 8'h08;flow_cnt  <= flow_cnt + 1'b1;i2c_data_w<= TIME_INI[47:40];end4'd12: beginif(i2c_done == 1'b1) beginyear     <= i2c_data_r;i2c_rh_wl<= 1'b1;flow_cnt <= 4'd0;endend4'd13: begin;enddefault: flow_cnt <= 4'd0;endcaseend
endendmodule

3.IIC驅動

module i2c_dri(                                                            input                clk        ,    input                rst_n      ,   //i2c interface                      input                i2c_rw         ,  //0是寫,1是讀input                i2c_begin      ,  //I2C觸發執行信號input        [15:0]  i2c_addr       ,  //I2C器件內地址input        [ 7:0]  i2c_data_w     ,  //I2C要寫的數據output  reg  [ 7:0]  i2c_data_r     ,  //I2C讀出的數據output  reg          i2c_busy       ,  //I2C忙信號output  reg          i2c_done   ,  //I2C一次操作完成output  reg          scl            ,  //I2C的SCL時鐘信號inout                sda   ,             //I2C的SDA信號output       reg    led2    ,   //output reg            dri_clk    //I2C數據(SDA)方向控制                                 );
parameter   SLAVE_ADDR = 7'b1010000   ;  //EEPROM從機地址
parameter   CLK_FREQ   = 26'd50_000_000; //模塊輸入的時鐘頻率
parameter   I2C_FREQ   = 18'd250_000;     //IIC_SCL的時鐘頻率//reg define
reg    [ 9:0]  clk_cnt   ; //分頻時鐘計數
reg    [ 7:0]  data_wr_t ; //I2C需寫的數據的臨時寄存
reg    [15:0]  addr_t    ; //讀寫地址臨時寄存
reg    [ 7:0]  data_r    ; //數據
reg    [ 7:0]  data_w    ; //數據
reg            r_or_w   ;   //讀寫
reg            sda_dir   ; //I2C數據(SDA)方向控制
reg            sda_out   ; //reg     [ 3:0]         flow_cnt    ;        // 流轉計數
//wire define
wire          sda_in     ; //SDA輸入信號
wire   [8:0]  clk_divide ; //模塊驅動時鐘的分頻系數assign  sda     = sda_out ;     //SDA數據輸出或高阻
assign  clk_divide = (CLK_FREQ/I2C_FREQ) >> 2'd2;//模塊驅動時鐘的分頻系數//生成I2C的SCL的四倍頻率的驅動時鐘用于驅動i2c的操作
always @(posedge clk or negedge rst_n) beginif(!rst_n) begindri_clk <=  1'b0;clk_cnt <= 10'd0;   endelse if(clk_cnt == clk_divide[8:1] - 1'd1) beginclk_cnt <= 10'd0;dri_clk <= ~dri_clk;endelseclk_cnt <= clk_cnt + 1'b1;
end
//////////////////////////////////
reg    [ 7:0]  data_temp    ; //數據
reg     flow_cnt_ok ;        // 流轉計數
reg    [ 6:0]  cnt       ; //計數
////////////////////////////////////////////////
/*
寫
0:空閑
1:加載器件地址
2:寫字節
3:加載16為地址高字節
4:寫字節
5:加載16為地址低字節
6:寫字節
7:加載數據
8:寫字節
9:發送停止位讀
0:空閑
1:加載器件地址
2:寫字節
3:加載16為地址高字節
4:寫字節
5:加載16為地址低字節
6:寫字節
10:加載器件地址+讀
8:寫字節
11:讀數據
12:發送停止*/
always @(posedge dri_clk or negedge rst_n) beginif(!rst_n) beginscl <=  1'b1;sda_out <=  1'b1;cnt<=  7'b0;flow_cnt<=4'b0;i2c_busy<=1'b0;flow_cnt_ok<= 1'b0;cnt<= 1'b0;end////////////////////////////////////////////else if (flow_cnt_ok&&(r_or_w==0))begin flow_cnt<=((flow_cnt>=4'd9)? (4'd0):(flow_cnt+4'd1));//狀態技術+1i2c_done<=1'b0;flow_cnt_ok<= 1'b0;end else if (flow_cnt_ok&&(r_or_w==1))begin if(flow_cnt<=4'd5)flow_cnt<=flow_cnt+1'b1;else if (flow_cnt==4'd6)flow_cnt<=4'd10;else if (flow_cnt==4'd10)flow_cnt<=4'd8;else if (flow_cnt==4'd8)flow_cnt<=4'd11;     else if (flow_cnt==4'd11)flow_cnt<=4'd12;else if (flow_cnt==4'd12)flow_cnt<=4'd0;i2c_done<=1'b0;flow_cnt_ok<= 1'b0;end ///////////////////////////////////////////////else if(flow_cnt == 4'b0) beginif(i2c_begin==1'b1&&i2c_busy==1'b0) beginr_or_w<=i2c_rw;addr_t<=i2c_addr;data_w<=i2c_data_w;i2c_busy<=1'b1;flow_cnt_ok<=1'b1;endelse flow_cnt = 4'b0;endelse if(flow_cnt == 4'd1) begin//加載寫字節data_temp<={SLAVE_ADDR,1'b0};flow_cnt_ok<=1'b1;endelse if(flow_cnt == 4'd3) begin//加載eeprom地址//data_temp<=addr_t[15:8];flow_cnt_ok<=1'b1;endelse if(flow_cnt == 4'd4) begin//加載eeprom地址//data_temp<=addr_t[15:8];flow_cnt_ok<=1'b1;endelse if(flow_cnt == 4'd5) begin//加載低8位地址data_temp<=addr_t[7:0];flow_cnt_ok<=1'b1;endelse if(flow_cnt == 4'd7) begin//加載要寫入的數據data_temp<=data_w[7:0];flow_cnt_ok<=1'b1;endelse if(flow_cnt == 4'd9) begin//發送STOPcnt     <= cnt +1'b1 ;case(cnt)7'd1 : sda_out <= 1'b0;          //開始I2C7'd2 : scl <= 1'b1;              7'd3 : sda_out <= 1'b1; //傳送器件地址7'd4 : begini2c_busy<=1'b0;i2c_done<=1'b1;scl <= 1'b1;sda_out <= 1'b1;flow_cnt_ok<=1'b1;cnt <= 1'b0;enddefault :  ;   endcaseendelse if(flow_cnt == 4'd2||flow_cnt == 4'd6||flow_cnt == 4'd8) begin//發送一個字節cnt     <= cnt +1'b1 ;case(cnt)//7'd0 :begin scl <= 1'b1;sda_out <= 1'b1;end7'd1 : sda_out <= 1'b0;          //開始I2C7'd3 : scl <= 1'b0;              7'd4 : sda_out <= data_temp[7]; //傳送器件地址7'd5 : scl <= 1'b1;              7'd7 : scl <= 1'b0;              7'd8 : sda_out <= data_temp[6]; 7'd9 : scl <= 1'b1;              7'd11: scl <= 1'b0;              7'd12: sda_out <= data_temp[5]; 7'd13: scl <= 1'b1;              7'd15: scl <= 1'b0;              7'd16: sda_out <= data_temp[4]; 7'd17: scl <= 1'b1;              7'd19: scl <= 1'b0;              7'd20: sda_out <= data_temp[3]; 7'd21: scl <= 1'b1;              7'd23: scl <= 1'b0;              7'd24: sda_out <= data_temp[2]; 7'd25: scl <= 1'b1;              7'd27: scl <= 1'b0;              7'd28: sda_out <= data_temp[1]; 7'd29: scl <= 1'b1;              7'd31: scl <= 1'b0;              7'd32: sda_out <= data_temp[0];          //0:寫7'd33: scl <= 1'b1;              7'd35: scl <= 1'b0;              7'd36: sda_out <= 1'bz;  //            7'd37: scl     <= 1'b1;    7'd38: begin                     //從機應答 if(sda == 1'b1) begin          //高電平表示未應答cnt <= 1'b0;flow_cnt = 4'b0;end    end                                          7'd39: begin                     scl <= 1'b0;                 cnt <= 1'b0;flow_cnt_ok<=1'b1;enddefault :  ;    endcaseendelse if(flow_cnt == 4'd10) begin//加載要讀的芯片地址data_temp<={SLAVE_ADDR,1'b1};flow_cnt_ok<=1'b1;scl <= 1'b1;//添加起始位endelse if(flow_cnt == 4'd12) begin//發送STOPcnt     <= cnt +1'b1 ;case(cnt)7'd1 : sda_out <= 1'b0;          //開始I2C7'd2 : scl <= 1'b1;              7'd3 : sda_out <= 1'b1; //傳送器件地址7'd4 : begini2c_busy<=1'b0;i2c_done<=1'b1;i2c_data_r<=data_r;scl <= 1'b1;sda_out <= 1'b1;flow_cnt_ok<=1'b1;cnt <= 1'b0;enddefault :  ;   endcaseendelse if(flow_cnt == 4'd11) begin//加載要讀的芯片地址cnt     <= cnt +1'b1 ;case(cnt)7'd1 : sda_out <= 1'bz;          //開始I2C7'd3 : scl <= 1'b0;              7'd5 : scl <= 1'b1; 7'd6 : data_r[7]<=sda;7'd7 : scl <= 1'b0;              7'd9 : scl <= 1'b1;  7'd10 : data_r[6]<=sda;7'd11: scl <= 1'b0;              7'd13: scl <= 1'b1;    7'd14 : data_r[5]<=sda;7'd15: scl <= 1'b0;              7'd17: scl <= 1'b1;              7'd18: data_r[4]<=sda;7'd19: scl <= 1'b0;              7'd21: scl <= 1'b1;              7'd22: data_r[3]<=sda;7'd23: scl <= 1'b0;              7'd25: scl <= 1'b1;              7'd26: data_r[2]<=sda;7'd27: scl <= 1'b0;              7'd29: scl <= 1'b1;              7'd30:data_r[1]<=sda;7'd31: scl <= 1'b0;              7'd33: scl <= 1'b1;              7'd34: data_r[0]<=sda;7'd35: scl <= 1'b0;  7'd36: sda_out <= 1'b0;           7'd37: scl <= 1'b1; 7'd39: scl <= 1'b0; 7'd40: sda_out <= 1'b1; 7'd42: begin                                  cnt <= 1'b0;flow_cnt_ok<=1'b1;enddefault :  ;  endcase  endelse ;
end
endmodule

4.波形

在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93386.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93386.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93386.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【k8s、docker】Headless Service(無頭服務)

文章目錄問題背景1、什么是Headless Service1.2 為什么 Zookeeper 使用 Headless Service&#xff1f;1.2 Headless Service 的 DNS 行為1.3 驗證示例1.4 如何創建 Headless Service&#xff1f;2. zk-0.zookeeper.default.svc.cluster.local 域名是如何創建出來的&#xff1f;…

scikit-learn/sklearn學習|套索回歸Lasso解讀

【1】引言 前序學習進程中&#xff0c;對用scikit-learn表達線性回歸進行了初步解讀。 線性回歸能夠將因變量yyy表達成由自變量xxx、線性系數矩陣www和截距bbb組成的線性函數式&#xff1a; y∑i1nwi?xibwTxby\sum_{i1}^{n}w_{i}\cdot x_{i}bw^T{x}byi1∑n?wi??xi?bwTxb實…

暴雨服務器:以定制化滿足算力需求多樣化

在數字經濟與實體經濟深度融合的浪潮下&#xff0c;互聯網行業正經歷著前所未有的技術變革。大數據分析、云計算服務、人工智能算法等技術的快速演進&#xff0c;推動著企業對于高性能計算基礎設施的需求呈現指數級增長。據IDC數據顯示&#xff0c;互聯網行業已成為全球服務器采…

JavaScript字符串詳解

創建字符串&#xff1a; 1.使用字面量(推薦)&#xff1a; 這是最常用、最直接的方式。你可以用單引號 ()、雙引號 (") 或反引號 () 把文本包起來 let singleQuote 單引號; let doubleQuote "雙引號"; let templateLiteral 反引號;2.使用String 構造函數&…

Kiro Preview 應用評測

Kiro應用評測 Kiro 是一個由亞馬遜推出的 AI 驅動的智能開發環境&#xff0c;從原型到生產全程陪伴您的開發過程。它將"靈感編程"的流暢性與規范的清晰性相結合&#xff0c;幫助您更快地構建更好的軟件。 昨天收到了Kiro的試用郵件&#xff0c;收到郵件后第一時間下載…

Flink2.0學習筆記:Flink服務器搭建與flink作業提交

一&#xff0c;下載flink:Downloads | Apache Flink,解壓后放入IDE工作目錄&#xff1a;我這里以1.17版本為例 可以看到&#xff0c;flink后期的版本中沒有提供window啟動腳本:start-cluster.bat 所以這里要通過windows自帶的wsl 系統啟動它 打開終端依次運行下列命令完成w…

MySQL鎖的分類

MySQL鎖可以按照多個維度進行分類&#xff0c;下面我用最清晰的方式為你梳理所有分類方式&#xff1a;一、按鎖的粒度分類&#xff08;最常用分類&#xff09;鎖類型作用范圍特點適用引擎示例場景表級鎖整張表開銷小、加鎖快&#xff0c;并發度低MyISAM, MEMORY數據遷移、全表統…

電腦上搭建HTTP服務器在局域網內其它客戶端無法訪問的解決方案

在電腦上開發一套HTTP服務器的程序在調試時&#xff0c;在本機內訪問正常&#xff0c;但是在本機外訪問就不正常&#xff0c;外部客戶端無法訪問或無法連接到本機的服務器的問題&#xff0c;這可能涉及網絡配置、防火墻、端口轉發或服務綁定等問題&#xff0c;在這里提供了解決…

雙指針和codetop2(最短路問題BFS)

雙指針和codetop21.雙指針1.[復寫0](https://leetcode.cn/problems/duplicate-zeros/)2.動態規劃1.[珠寶的最高價值](https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/description/)2.[解碼方法](https://leetcode.cn/problems/decode-ways/)3.[下降路徑最小和](ht…

基于K鄰近算法(KNN)的數據回歸預測模型

一、作品詳細簡介 1.1附件文件夾程序代碼截圖 全部完整源代碼&#xff0c;請在個人首頁置頂文章查看&#xff1a; 學行庫小秘_CSDN博客https://blog.csdn.net/weixin_47760707?spm1000.2115.3001.5343 1.2各文件夾說明 1.2.1 main.m主函數文件 該MATLAB代碼實現了一個基于…

【123頁PPT】化工行業數字化解決方案(附下載方式)

篇幅所限&#xff0c;本文只提供部分資料內容&#xff0c;完整資料請看下面鏈接 https://download.csdn.net/download/2501_92808859/91654005 資料解讀&#xff1a;【123頁PPT】化工行業數字化解決方案 詳細資料請看本解讀文章的最后內容。化工行業作為國民經濟的重要支柱之…

c++--文件頭注釋/doxygen

文件頭注釋 開源項目&#xff1a; /*** file robot_base.cpp* author Mr.Wu* date 2025-05-28* version 1.0.0* brief Robot basic drive to communicate with controller** copyright Copyright (c) 2025 google.** Licensed under the Apache License, Version 2.…

【教程】筆記本安裝FnOS設置合蓋息屏不休眠

重裝FnOS好幾次了&#xff0c;合蓋后屏幕關閉但不休眠的問題每次都要網上找參差不齊的教程&#xff0c;麻煩死了&#xff0c;索性記錄一下方便以后復制粘貼。 使用root登錄 sudo -i修改系統配置文件編輯logind.conf文件&#xff1a; 打開終端&#xff0c;輸入以下命令以編輯log…

深入解析 Monkey OCR:本地化、多語言文本識別的利器與實踐指南

在信息爆炸的時代&#xff0c;從圖片、掃描文檔中高效提取結構化文本的需求日益迫切。OCR&#xff08;光學字符識別&#xff09;技術成為解決這一問題的核心工具。盡管市面上有 Abbyy FineReader、Adobe Acrobat 等商業巨頭&#xff0c;以及 Tesseract、PaddleOCR 等開源方案&a…

動態規劃法 - 53. 最大子數組和

什么是動態規劃法&#xff1f; 簡單說&#xff0c;動態規劃&#xff08;Dynamic Programming&#xff0c;簡稱 DP&#xff09; 是一種**「把復雜問題拆解成小問題&#xff0c;通過解決小問題來解決大問題」**的方法。 核心思路有兩個&#xff1a; 1.拆分問題&#xff1a;把原問…

STM32CUBEMX配置stm32工程

1.新建工程2.選擇芯片3.配置各種片上外設和時鐘4.創建工程5.根據文件內容進行修改工程注意&#xff1a;最好根據工程規范來做&#xff0c;因為有時我們需要更改配置并重新生成&#xff0c;如果不按規范來會導致部分代碼會被系統清除&#xff0c;在工程中中有很多成對的BEGIN和E…

Day07 緩存商品 購物車

緩存菜品問題說明用戶端小程序展示的菜品數據都是通過查詢數據庫獲得&#xff0c;如果用戶端訪問量比較大&#xff0c;數據庫訪問壓力隨之增大。結果&#xff1a;系統響應慢&#xff0c;用戶體驗差實現思路通過 Redis 來緩存菜品數據&#xff0c;減少數據庫查詢操作。緩存邏輯分…

Jenkins(集群與流水線配置)

Jenkins&#xff08;集群與流水線配置&#xff09; Jenkins集群 集群化構建可以提升構建效率&#xff0c;也可以并發在多臺機器上執行構建。 安裝前提&#xff1a;內存至少512MB、Java 17 以上、Maven環境、Git環境 配置集群步驟 配置節點菜單新建節點查看節點配置狀態 新建完節…

深入剖析ROS參數服務器通信機制 ——共享全局數據的“云端倉庫”實現原理

?1. 核心概念&#xff1a;分布式數據共享容器? ?定位?&#xff1a;ROS參數服務器&#xff08;Parameter Server&#xff09;是ROS架構中的全局共享存儲系統&#xff0c;相當于機器人的“云端倉庫”。 ?作用?&#xff1a; 存儲多節點共享的靜態配置參數&#xff08;如機器…

21.AlexNet

雖然LeNet在手寫數字識別上取得了不錯的結果&#xff0c;但是他在對于更大的數據集效果就十分有限。 一方面&#xff0c;對于更大尺寸的圖像效果有限 另一方面&#xff0c;對于更多分類的任務效果有限 自LeNet后的十幾年&#xff0c;計算機視覺領域步入寒冬&#xff0c;神經網絡…