http://www./bbs/forum.php?mod=viewthread&tid=56487#lastpost 2016
STM8L有DMA功能,STM8S沒有這個功能.DMA用于傳輸數(shù)據(jù),可以把內(nèi)存中的數(shù)據(jù)(比如一個存放數(shù)據(jù)的數(shù)組),傳遞給外設(shè)(比如可以將數(shù)據(jù)傳遞到USART的發(fā)送數(shù)據(jù)寄存器),當(dāng)然也可以反向,從外設(shè)的寄存器傳遞給內(nèi)存,DMA的第四個通道還具有,將數(shù)據(jù)從內(nèi)存?zhèn)鬟f到內(nèi)存的功能.傳遞數(shù)據(jù)時,不占用CPU資源.
如上圖,STM8L擁有四個DMA通道,每個通道都可以響應(yīng)DMA請求,獨立傳送數(shù)據(jù).如果四個通道同時收到DMA請求,DMA控制器會根據(jù)軟件優(yōu)先級和硬件優(yōu)先,決定響應(yīng)的先后順序.
上圖是支持DMA傳輸數(shù)據(jù)的外設(shè),從上圖還可以看到具體每個外設(shè)對應(yīng)哪一個DMA通道,這個對編程很重.
上圖是DMA的配置流程,基本的配置如下:
①配置外設(shè)寄存器地址
②配置內(nèi)存寄存器地址
③配置傳輸數(shù)據(jù)的字節(jié)數(shù)
④設(shè)置通道優(yōu)先級
⑤設(shè)置數(shù)據(jù)傳輸方向,是否自動連續(xù)傳輸,傳輸數(shù)據(jù)是16位還是8位,
⑥使能DMA通道
⑦是DMA通道總開關(guān)
本例程,使用DMA傳送數(shù)據(jù)到USART的發(fā)送寄存器,周期性的重置DMA,重新發(fā)送數(shù)據(jù)。
- /*硬件連接*/
- // PC3(TX)---->
- /****************************************************************************************
- *開發(fā)環(huán)境:IAR for stm8 v6.5.3
- *硬件平臺:STM8L-DISCOVERY
- *功能說明:使用DMA通道1傳送數(shù)據(jù)到USART的發(fā)送寄存器 USART1_DR,周期性的發(fā)送數(shù)組中的數(shù)據(jù)
- * 對比.
- *作 者:茗風(fēng)
- ****************************************************************************************/
- #include"iostm8l152c6.h"
- #include"stdbool.h"
- #include"stdint.h"
- #define TXBUF_SIZE 9
- #define RXBUF_SIZE 25
- #define USART1_DR_ADRESS 0x5231
- bool bTX_finished=false;
- bool bRX_finished=false;//串口接收完一幀數(shù)據(jù)標(biāo)志位
- uint8_t ui8TX_number = 0;
- uint8_t ui8RX_counter=0;
- uint8_t ui8TX_buffer[TXBUF_SIZE]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};
- uint8_t ui8RX_buffer[RXBUF_SIZE];
- /******************************************************************************************************
- * 名 稱:void delay_10ms(uint8_t x_ms)
- * 功 能:延時10ms
- * 入口參數(shù):無
- * 出口參數(shù):無
- * 說 明:
- * 范 例:無
- ******************************************************************************************************/
- void delay_100ms(void)
- {
- uint8_t i,j;
- for(i=0;i<255;i++)//2*255個指令周期
- for(j=0;j<255;j++);//2*255個指令周期
- //delay_10ms共消耗 x_ms*2*255+2*x_ms個指令周期
- //255*2*255+2*255=130610us=130ms
- //此延時函數(shù),延時時間為130ms
- //16M/8/2=1M 一個指令周期為1us
- }
- /******************************************************************************************************
- * 名 稱:void GPIO_Init(void)
- * 功 能:初始化PC7為高速推挽輸出
- * 入口參數(shù):無
- * 出口參數(shù):無
- * 說 明:測量系統(tǒng)時鐘頻率的IO,測量到的頻率是:目標(biāo)時鐘源/2/6
- * 范 例:無
- ******************************************************************************************************/
- void GPIO_Init(void)
- {
- PC_CR1_C17 =1;//推挽輸出
- PC_CR2_C27 =1;//高速輸出
- PC_DDR_DDR7 =1;//PC4輸出
- // PC_ODR_ODR7 =0;//輸出低電平
- }
- /******************************************************************************************************
- * 名 稱:void UART_Init(void)
- * 功 能:UART定時器初始化系統(tǒng)
- * 入口 參數(shù):無
- * 出口 參數(shù):無
- * 說 明:UART初始化為 9600 1 8 n
- * 范 例:無
- ******************************************************************************************************/
- void UART_Init(void)
- {
- /*********************************/
- PC_DDR_DDR2 =0;//輸入
- PC_CR1_C12 =1;//上拉輸入
- PC_CR2_C22 =0;
-
- PC_ODR_ODR3 =1;
- PC_CR1_C13 =1;//推挽輸出
- PC_CR2_C23 =1;//輸出擺率10M
- PC_DDR_DDR3 =1;//輸出高電平,TX空閑狀態(tài)為高電平,如果不設(shè)置,會莫名奇妙的發(fā)送0x00
-
- CLK_PCKENR1_PCKEN15=1;//開啟USART外設(shè)時鐘
-
- //開啟引腳的UART功能
- //00: USART1_TX on PC3 and USART1_RX on PC2
- //01: USART1_TX on PA2 and USART1_RX on PA3
- //10: USART1_TX on PC5 and USART1_RX on PC6
- SYSCFG_RMPCR1_USART1TR_REMAP =0;//PC2,PC3
- //如果需要使用其他引腳作為串口發(fā)送接收引腳,請在這里選擇
-
-
- //設(shè)置串口工作方式
- USART1_CR1_M =0;//1 start bit,8 data bit,n stop bit
- USART1_CR3_STOP0=0;USART1_CR3_STOP1=0;//1 stop bit
- //設(shè)置波特率
- //波特率設(shè)置為9600
- // 2000000/9600=208 //2000000是此時系統(tǒng)的主時鐘頻率,默認(rèn)8分頻,16M/8=2M
- //208(DEC)=00D0(HEX)
- USART1_BRR2 =0x00;//the BRR2 should be programmed before BRR1
- USART1_BRR1 =0x0D;
- USART1_CR5_DMAT=1;// DMA mode is enabled for transmission.
- // USART1_CR2_TEN=0;//使能發(fā)送
- // USART1_CR2_TIEN=0;//打開發(fā)送中斷
- USART1_CR2_REN=1;//使能接收
- USART1_CR2_RIEN=1;//打開接收中斷
- }
- /******************************************************************************************************
- * 名 稱:void DMA_Config(void)
- * 功 能:啟用DMA
- * 入口參數(shù):無
- * 出口參數(shù):無
- * 說 明:STM8L152C6屬于中等容量MCU,只有一路DAC輸出,輸出引腳為PF0
- * 范 例:無
- ******************************************************************************************************/
- void DMA_Config(void)
- {
- //------打開DAM時鐘------
- CLK_PCKENR2_PCKEN24=1;
-
- //------設(shè)置傳送的字節(jié)數(shù),------
- DMA1_C1NDTR=9;
-
- //------設(shè)置通道優(yōu)先級------
- DMA1_C1SPR_PL0=0;DMA1_C1SPR_PL1=1;
- //------設(shè)置傳送方向------
- DMA1_C1CR_DIR=1;
- /* 0: Transfer from the peripheral to the memory.
- 1: Transfer from the memory to the peripheral.*/
- //------設(shè)置模式------
- DMA1_C1CR_CIRC=0;
- /* Auto-reload mode
- 0: Circular mode disabled.
- 1: Circular mode enabled. */
- //------設(shè)置增還是減地址------
- DMA1_C1CR_MINCDEC=1;
- /* 0: Decrement mode.
- 1: Increment mode.*/
- //------設(shè)置傳送數(shù)據(jù)位數(shù)------
- DMA1_C1SPR_TSIZE=0;
- /* 0: 8-bit mode
- 1: 16-bit mode */
-
- //------設(shè)置DMA通道1外設(shè)地址------
- DMA1_C1PARH=(uint8_t)((uint16_t)USART1_DR_ADRESS >> (uint8_t)8);
- DMA1_C1PARL=(uint8_t)USART1_DR_ADRESS;
-
- //------設(shè)置DMA通道1內(nèi)存地址------
- DMA1_C1M0ARH=(uint8_t)((uint16_t)&ui8TX_buffer >> (uint8_t)8);
- DMA1_C1M0ARL=(uint8_t)&ui8TX_buffer;
-
- DMA1_C1CR_EN=1;
-
- DMA1_GCSR_GEN=1;
-
- }
- void main(void)
- {
- // GPIO_Init();
- DMA_Config();
- UART_Init();
- asm("rim"); //enable interrupts
- while(1)
- {
- ui8TX_number=9;
- USART1_CR2_TEN=1;//打開發(fā)送
- delay_100ms();
- delay_100ms();
- delay_100ms();
- delay_100ms();
- DMA1_C1CR_EN=0;
- DMA1_C1NDTR=9;
- DMA1_C1CR_EN=1;
- // asm("wfi");
- }
- }
- /*************************************************************************************************** ***
- * 名 稱: UART_OnTx()
- * 功 能: UART的Tx事件處理函數(shù)
- * 入口參數(shù):無
- * 出口參數(shù):無
- * 說 明:發(fā)送ui8TX_buffer數(shù)組中的數(shù)據(jù),發(fā)送完成后,置位bTX_finished標(biāo)志位,下一次進(jìn)入中斷后關(guān)閉發(fā)送
- * 范 例:無
- ******************************************************************************************************/
- #pragma vector=USART_T_TXE_vector
- __interrupt void USART_TX_ISR (void)
- {
- static uint8_t cnts=0;
- if(bTX_finished && USART1_SR_TC==1)
- {
- bTX_finished=false;
- USART1_CR2_TIEN=0;//關(guān)閉發(fā)送中斷
- USART1_CR2_TEN=0;//關(guān)閉發(fā)送
- }
- else if(USART1_SR_TC==1)
- {
- USART1_DR=ui8TX_buffer[cnts++];
- if(cnts==ui8TX_number)
- {
- cnts=0;
- bTX_finished=true;
- }
- }
- }
- /******************************************************************************************************
- * 名 稱: UART_OnRx()
- * 功 能: UART的Tx事件處理函數(shù)
- * 入口 參數(shù):無
- * 出口 參數(shù):無
- * 說 明:
- * 范 例:無
- ******************************************************************************************************/
- #pragma vector=USART_R_RXNE_vector
- __interrupt void USART_RX_ISR(void)
- {
- static uint8_t ui8RX_temp=0;
- if(USART1_SR_RXNE==1)
- {
- ui8RX_temp = USART1_DR;
- }
- }
復(fù)制代碼
|