|
0.png (171.63 KB, 下載次數(shù): 110)
下載附件
2016-6-24 10:56 上傳
用R7F0C802陸陸續(xù)編寫了幾個(gè)程序,小面分享一些經(jīng)驗(yàn),即將會(huì)用到的朋友一些參考。
1.CODE GENERATOR工作原理
CODE GENERATOR是作為一個(gè)插件導(dǎo)入到CubeSuit+里面的。這個(gè)東西挺好的用的,基本上所有的外設(shè)的寄存器都可以用圖形化配置了,用戶只需要寫自己的應(yīng)用程序即可。它的原理沒有找到,但是在使用過程中發(fā)現(xiàn)它其實(shí)就是由一系列模版組成,當(dāng)你選擇了某個(gè)功能后模版就自動(dòng)加載那條語句,最后再把這個(gè)模版拷貝到用戶工作區(qū)中。這種方法其實(shí)STM32也有,不過瑞薩把 CODE GENERATOR集成到了CubeSuit+里面,使得程序員使用起來還是很方便的。不過CODE GENERATOR生產(chǎn)配置代碼雖然很方便但其隱藏了細(xì)節(jié),對(duì)于我等這種喜歡刨根問底的人來說感覺有點(diǎn)不爽,還是直接配置寄存器來的舒服。
2.瑞薩單片機(jī)按位使用及聲明位置
在瑞薩單片機(jī)中是可以像51一樣按位來使用引腳的,比如說點(diǎn)燈程序中我們就可以P0.4=1 ;P0.4=0 ;來控制P0.4引腳的輸出電平。特別是對(duì)于寄存器的配置直接寫
PU4 = 0xff
PMC0 =0x00
就行了,但是問題是P0.4, PU4, PMC0 的聲明在哪呢?它們?nèi)绾闻c具體芯片的地址對(duì)應(yīng)呢?我找了一圈沒找到,后來看了瑞薩的官方文檔才知道原來所有的秘密都在#pragma sfr 這句話中,也就是加上這句話就把P0.4, PU4等的聲明全部包含了,個(gè)人猜想瑞薩是把這些申請(qǐng)都包含在了庫(kù)中,通過預(yù)處理來引入這些庫(kù)。以前一直以為歐美的IC庫(kù)封裝都很好,但其至少還要包含一個(gè)頭文件。而瑞薩只需要引入一個(gè)預(yù)編譯命令即可。現(xiàn)在看來一山還比一山高,不得不佩服。
0.png (93.61 KB, 下載次數(shù): 92)
下載附件
2016-6-24 11:00 上傳
部分測(cè)試代碼:
- *******************************************************************************
- ** Include files
- *******************************************************************************
- */
- #pragma interrupt INTTM00 interrupt_inttm00
- #pragma interrupt INTTM01 interrupt_inttm01
- #pragma interrupt INTTM01H interrupt_inttm01h
- #include "common.h"
- /*
- *******************************************************************************
- ** Global declaration
- *******************************************************************************
- */
- void main(void);
- void IO_Init(void);
- void TAU0_PWM_Init(void);
- void TAU0_Start(void);
- void TAU0_Stop(void);
- unsigned long cnt[3];
- unsigned short breath;
- unsigned char breath_dir;
- /*
- **---------------------------------------------------------------------
- ** Abstract: This function implements main function.
- ** Parameters: None
- ** Returns: None
- **---------------------------------------------------------------------
- */
- void main(void)
- {
- unsigned char mode;
-
- cnt[0] = 0;
- cnt[1] = 0;
- cnt[2] = 0;
-
- breath = 0;
- breath_dir = 0;
-
- /* I/O Port Init */
- IO_Init();
-
- /* TAU0 Timer Init */
- TAU0_PWM_Init();
- /* Enable Interrupt */
- EI();
- /* Start Timer, i.e. PWM output */
- TAU0_Start();
- mode = 1;
- /* Program Loop */
- while(1)
- {
- if (P13.7 == 0)
- {
- if (mode)
- {
- mode = 0;
- TAU0_Stop();
- }
- }
- else
- {
- if (mode == 0)
- {
- mode = 1;
- TAU0_Start();
- }
- }
- } /* while(1) */
- }
- /*
- **---------------------------------------------------------------------
- ** Abstract: This function implements I/O port initialization.
- ** Parameters: None
- ** Returns: None
- **---------------------------------------------------------------------
- */
- void IO_Init(void)
- {
- /* Port Mode '0'=Out, '1'=In */
- PM0 = 0x01;
- PM4 = 0x00;
- /* Port Register */
- P0 = 0x00;
- P4 = 0x00;
- /* Pull-up resistor */
- PU0 = 0x00;
- PU4 = 0x00;
- PU12 = 0x00;
- /* Port output mode '1'=open-drain */
- POM0 = 0x03;
- /* Port mode control '0'=I/O, '1'=AIN*/
- PMC0 = 0xE1;
- /* Peripheral I/O redirection */
- PIOR = 0x00;
- }
- /*
- **---------------------------------------------------------------------
- ** Abstract: This function start the timer.
- ** Parameters: None
- ** Returns: None
- **---------------------------------------------------------------------
- */
- void TAU0_Start(void)
- {
- TMIF00 = 0U; /* clear INTTM00 interrupt flag */
- TMMK00 = 0U; /* enable INTTM00 interrupt */
- TMIF01 = 0U; /* clear INTTM01 interrupt flag */
- TMMK01 = 0U; /* enable INTTM01 interrupt */
- TOE0 |= 0x03U; /* enable CH1 output */
- TS0 = 0x03U; /* Trigger CH0 start */
- }
- /*
- **---------------------------------------------------------------------
- ** Abstract: This function stop the timer.
- ** Parameters: None
- ** Returns: None
- **---------------------------------------------------------------------
- */
- void TAU0_Stop(void)
- {
- TT0 |= 0x03; /* Trigger CH0, CH1 to stop */
- TOE0 &= ~0x02; /* disable CH1 output */
- TMMK00 = 1U; /* disable INTTM00 interrupt */
- TMIF00 = 0U; /* clear INTTM00 interrupt flag */
- TMMK01 = 1U; /* disable INTTM01 interrupt */
- TMIF01 = 0U; /* clear INTTM01 interrupt flag */
- }
- /*
- **---------------------------------------------------------------------
- ** Abstract : This function implements timer initialization for PWM output.
- ** Parameters : None
- ** Returns : None
- ** Remark : Set PWM frequency = 1KHz,
- **---------------------------------------------------------------------
- */
- void TAU0_PWM_Init(void)
- {
- TAU0EN = 1; /* supplies input clock */
- TPS0 = 0x0F; /* CK01=fclk, CK00=fclk/2^15 */
- /* Stop all channels */
- TT0 = 0x00U;
- /* Mask channel 0 interrupt */
- TMMK00 = 1U; /* disable INTTM00 interrupt */
- TMIF00 = 0U; /* clear INTTM00 interrupt flag */
- /* Mask channel 1 interrupt */
- TMMK01 = 1U; /* disable INTTM01 interrupt */
- TMIF01 = 0U; /* clear INTTM01 interrupt flag */
- /* Mask channel 1 higher 8 bits interrupt */
- TMMK01H = 1U; /* disable INTTM01H interrupt */
- TMIF01H = 0U; /* clear INTTM01H interrupt flag */
- /* Set INTTM00 low priority */
- TMPR100 = 1U;
- TMPR000 = 1U;
- /* Channel 0 is used as master channel for PWM output function */
- TMR00H = 0x80U; /* CK01 */
- TMR00L = 0x01U;
- #if 0
- TDR00H = 0x13U; /* TDR00 = 4999+1 (0x1387H+1), 1KHz */
- TDR00L = 0x87U;
- #else
- TDR00H = 0x1FU; /* TDR00 = 8191+1 (0x1fffH+1), ~610Hz */
- TDR00L = 0xFFU;
- #endif
- TOL0 &= ~0x01;
- TO0 &= ~0x01;
- TOE0 |= ~0x01;
-
- /* Channel 1 is used as slave channel for PWM output function */
- TMR01H = 0x84U; /* CK01 */
- TMR01L = 0x09U;
- #if 0
- TDR01H = 0x03U; /* TDR01 set duty ratio of TDR00 */
- TDR01L = 0xE7U; /* TDR01 = 999+1 (0x03E7+1), 20% Duty ratio */
- #else
- TDR01H = 0x00U;
- TDR01L = 0x00U;
- #endif
- TOM0 = 0x02U;
- TO0 &= ~0x02;
- TO0 |= 0x02U;
- TOE0 |= 0x02U;
- TOL0 = 0x02U;
- /* Set TO00, TO01 pin */
- P0 &= 0xE7U;
- PM0 &= 0xE7U;
- }
- /*
- **---------------------------------------------------------------------
- ** Abstract: This function implements timer interrupt.
- ** Parameters: None
- ** Returns: None
- **---------------------------------------------------------------------
- */
- __interrupt void interrupt_inttm00(){
- cnt[0]++;
- if (breath_dir == 0)
- {
- /* dimm on */
- if (breath <= 0x1fff)
- {
- breath += 0x10;
- }
- else
- {
- breath = 0x2000;
- breath_dir = 1;
- }
-
- }
- else
- {
- /* dimm off */
- if (breath > 0)
- {
- breath -= 0x100;
- }
- else
- {
- breath = 0;
- breath_dir = 0;
- }
- }
- TDR01H = (unsigned char)(breath>>8);
- TDR01L = (unsigned char)(breath&0x00ff);
- }
- /*
- **---------------------------------------------------------------------
- ** Abstract: This function implements timer interrupt.
- ** Parameters: None
- ** Returns: None
- **---------------------------------------------------------------------
- */
- __interrupt void interrupt_inttm01(){
- cnt[1]++;
- }
- /*
- **---------------------------------------------------------------------
- ** Abstract: This function implements timer interrupt.
- ** Parameters: None
- ** Returns: None
- **---------------------------------------------------------------------
- */
- __interrupt void interrupt_inttm01h(){
- cnt[2]++;
- }
復(fù)制代碼
0.png (51.45 KB, 下載次數(shù): 96)
下載附件
2016-6-24 11:00 上傳
全部資料下載:
|
|