找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7971|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM8L的DMA詳解 含例程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140343 發(fā)表于 2016-10-10 00:07 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
STM8L有DMA功能,STM8S沒有這個(gè)功能.DMA用于傳輸數(shù)據(jù),可以把內(nèi)存中的數(shù)據(jù)(比如一個(gè)存放數(shù)據(jù)的數(shù)組),傳遞給外設(shè)(比如可以將數(shù)據(jù)傳遞到USART的發(fā)送數(shù)據(jù)寄存器),當(dāng)然也可以反向,從外設(shè)的寄存器傳遞給內(nèi)存,DMA的第四個(gè)通道還具有,將數(shù)據(jù)從內(nèi)存?zhèn)鬟f到內(nèi)存的功能.傳遞數(shù)據(jù)時(shí),不占用CPU資源.

如上圖,STM8L擁有四個(gè)DMA通道,每個(gè)通道都可以響應(yīng)DMA請(qǐng)求,獨(dú)立傳送數(shù)據(jù).如果四個(gè)通道同時(shí)收到DMA請(qǐng)求,DMA控制器會(huì)根據(jù)軟件優(yōu)先級(jí)和硬件優(yōu)先,決定響應(yīng)的先后順序.

上圖是支持DMA傳輸數(shù)據(jù)的外設(shè),從上圖還可以看到具體每個(gè)外設(shè)對(duì)應(yīng)哪一個(gè)DMA通道,這個(gè)對(duì)編程很重.


上圖是DMA的配置流程,基本的配置如下:
①配置外設(shè)寄存器地址
②配置內(nèi)存寄存器地址
③配置傳輸數(shù)據(jù)的字節(jié)數(shù)
④設(shè)置通道優(yōu)先級(jí)
⑤設(shè)置數(shù)據(jù)傳輸方向,是否自動(dòng)連續(xù)傳輸,傳輸數(shù)據(jù)是16位還是8位,
⑥使能DMA通道
⑦是DMA通道總開關(guān)

本例程,使用DMA傳送數(shù)據(jù)到USART的發(fā)送寄存器,周期性的重置DMA,重新發(fā)送數(shù)據(jù)。



  1. /*硬件連接*/

  2. // PC3(TX)---->

  3. /****************************************************************************************

  4. *開發(fā)環(huán)境:IAR for stm8 v6.5.3

  5. *硬件平臺(tái):STM8L-DISCOVERY

  6. *功能說(shuō)明:使用DMA通道1傳送數(shù)據(jù)到USART的發(fā)送寄存器 USART1_DR,周期性的發(fā)送數(shù)組中的數(shù)據(jù)

  7. *         對(duì)比.

  8. *作    者:茗風(fēng)

  9. ****************************************************************************************/

  10. #include"iostm8l152c6.h"

  11. #include"stdbool.h"

  12. #include"stdint.h"


  13. #define  TXBUF_SIZE           9

  14. #define  RXBUF_SIZE           25

  15. #define  USART1_DR_ADRESS     0x5231


  16. bool bTX_finished=false;

  17. bool bRX_finished=false;//串口接收完一幀數(shù)據(jù)標(biāo)志位

  18. uint8_t ui8TX_number = 0;

  19. uint8_t ui8RX_counter=0;

  20. uint8_t ui8TX_buffer[TXBUF_SIZE]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};

  21. uint8_t ui8RX_buffer[RXBUF_SIZE];

  22. /******************************************************************************************************

  23. *  名    稱:void delay_10ms(uint8_t x_ms)

  24. *  功    能:延時(shí)10ms

  25. *  入口參數(shù):無(wú)

  26. *  出口參數(shù):無(wú)

  27. *  說(shuō)    明:

  28. *  范    例:無(wú)

  29. ******************************************************************************************************/

  30. void delay_100ms(void)

  31. {

  32.   uint8_t i,j;

  33.   for(i=0;i<255;i++)//2*255個(gè)指令周期

  34.     for(j=0;j<255;j++);//2*255個(gè)指令周期

  35.   //delay_10ms共消耗 x_ms*2*255+2*x_ms個(gè)指令周期  

  36.   //255*2*255+2*255=130610us=130ms

  37.   //此延時(shí)函數(shù),延時(shí)時(shí)間為130ms

  38.   //16M/8/2=1M 一個(gè)指令周期為1us

  39. }

  40. /******************************************************************************************************

  41. *  名    稱:void GPIO_Init(void)

  42. *  功    能:初始化PC7為高速推挽輸出

  43. *  入口參數(shù):無(wú)

  44. *  出口參數(shù):無(wú)

  45. *  說(shuō)    明:測(cè)量系統(tǒng)時(shí)鐘頻率的IO,測(cè)量到的頻率是:目標(biāo)時(shí)鐘源/2/6

  46. *  范    例:無(wú)

  47. ******************************************************************************************************/

  48. void GPIO_Init(void)

  49. {

  50.    PC_CR1_C17  =1;//推挽輸出

  51.    PC_CR2_C27  =1;//高速輸出

  52.    PC_DDR_DDR7 =1;//PC4輸出

  53. //   PC_ODR_ODR7 =0;//輸出低電平

  54. }

  55. /******************************************************************************************************

  56. * 名             稱:void UART_Init(void)

  57. * 功            能:UART定時(shí)器初始化系統(tǒng)

  58. * 入口   參數(shù):無(wú)

  59. * 出口   參數(shù):無(wú)

  60. * 說(shuō)       明:UART初始化為 9600 1 8 n

  61. * 范      例:無(wú)

  62. ******************************************************************************************************/

  63. void UART_Init(void)

  64. {

  65.     /*********************************/

  66.     PC_DDR_DDR2 =0;//輸入

  67.     PC_CR1_C12  =1;//上拉輸入

  68.     PC_CR2_C22 =0;

  69.    

  70.     PC_ODR_ODR3 =1;

  71.     PC_CR1_C13  =1;//推挽輸出

  72.     PC_CR2_C23  =1;//輸出擺率10M   

  73.     PC_DDR_DDR3 =1;//輸出高電平,TX空閑狀態(tài)為高電平,如果不設(shè)置,會(huì)莫名奇妙的發(fā)送0x00

  74.    


  75.     CLK_PCKENR1_PCKEN15=1;//開啟USART外設(shè)時(shí)鐘

  76.    

  77.     //開啟引腳的UART功能

  78.     //00: USART1_TX on PC3 and USART1_RX on PC2

  79.     //01: USART1_TX on PA2 and USART1_RX on PA3

  80.     //10: USART1_TX on PC5 and USART1_RX on PC6

  81.     SYSCFG_RMPCR1_USART1TR_REMAP =0;//PC2,PC3

  82.     //如果需要使用其他引腳作為串口發(fā)送接收引腳,請(qǐng)?jiān)谶@里選擇

  83.    

  84.    

  85.     //設(shè)置串口工作方式

  86.     USART1_CR1_M =0;//1 start bit,8 data bit,n stop bit

  87.     USART1_CR3_STOP0=0;USART1_CR3_STOP1=0;//1 stop bit

  88.     //設(shè)置波特率

  89.     //波特率設(shè)置為9600

  90.     // 2000000/9600=208    //2000000是此時(shí)系統(tǒng)的主時(shí)鐘頻率,默認(rèn)8分頻,16M/8=2M

  91.     //208(DEC)=00D0(HEX)

  92.     USART1_BRR2 =0x00;//the BRR2 should be programmed before BRR1

  93.     USART1_BRR1 =0x0D;

  94.     USART1_CR5_DMAT=1;// DMA mode is enabled for transmission.

  95. //    USART1_CR2_TEN=0;//使能發(fā)送

  96. //    USART1_CR2_TIEN=0;//打開發(fā)送中斷

  97.     USART1_CR2_REN=1;//使能接收

  98.     USART1_CR2_RIEN=1;//打開接收中斷

  99. }

  100. /******************************************************************************************************

  101. *  名    稱:void DMA_Config(void)

  102. *  功    能:?jiǎn)⒂肈MA

  103. *  入口參數(shù):無(wú)

  104. *  出口參數(shù):無(wú)

  105. *  說(shuō)    明:STM8L152C6屬于中等容量MCU,只有一路DAC輸出,輸出引腳為PF0

  106. *  范    例:無(wú)

  107. ******************************************************************************************************/

  108. void DMA_Config(void)

  109. {

  110.   //------打開DAM時(shí)鐘------

  111.   CLK_PCKENR2_PCKEN24=1;

  112.   

  113.   //------設(shè)置傳送的字節(jié)數(shù),------

  114.   DMA1_C1NDTR=9;  

  115.   

  116.   //------設(shè)置通道優(yōu)先級(jí)------

  117.   DMA1_C1SPR_PL0=0;DMA1_C1SPR_PL1=1;


  118.   //------設(shè)置傳送方向------

  119.   DMA1_C1CR_DIR=1;  

  120. /*  0: Transfer from the peripheral to the memory.

  121.    1: Transfer from the memory to the peripheral.*/



  122.   //------設(shè)置模式------  

  123.   DMA1_C1CR_CIRC=0;

  124. /* Auto-reload mode

  125.    0: Circular mode disabled.

  126.    1: Circular mode enabled.   */


  127.   //------設(shè)置增還是減地址------   

  128.   DMA1_C1CR_MINCDEC=1;

  129. /*  0: Decrement mode.

  130.     1: Increment mode.*/


  131.   //------設(shè)置傳送數(shù)據(jù)位數(shù)------

  132.   DMA1_C1SPR_TSIZE=0;

  133. /*  0: 8-bit mode

  134.     1: 16-bit mode */

  135.   

  136.     //------設(shè)置DMA通道1外設(shè)地址------

  137.   DMA1_C1PARH=(uint8_t)((uint16_t)USART1_DR_ADRESS >> (uint8_t)8);

  138.   DMA1_C1PARL=(uint8_t)USART1_DR_ADRESS;

  139.    

  140.   //------設(shè)置DMA通道1內(nèi)存地址------

  141.   DMA1_C1M0ARH=(uint8_t)((uint16_t)&ui8TX_buffer >> (uint8_t)8);

  142.   DMA1_C1M0ARL=(uint8_t)&ui8TX_buffer;

  143.   

  144.   DMA1_C1CR_EN=1;

  145.   

  146.   DMA1_GCSR_GEN=1;

  147.   

  148. }

  149. void main(void)

  150. {

  151. //  GPIO_Init();

  152.   DMA_Config();

  153.   UART_Init();

  154.   asm("rim");               //enable interrupts

  155.   while(1)

  156.   {

  157.     ui8TX_number=9;

  158.     USART1_CR2_TEN=1;//打開發(fā)送

  159.     delay_100ms();

  160.     delay_100ms();

  161.     delay_100ms();

  162.     delay_100ms();

  163.     DMA1_C1CR_EN=0;

  164.     DMA1_C1NDTR=9;

  165.     DMA1_C1CR_EN=1;


  166. //    asm("wfi");

  167.   }

  168. }

  169. /*************************************************************************************************** ***

  170. * 名 稱: UART_OnTx()

  171. * 功 能: UART的Tx事件處理函數(shù)

  172. * 入口參數(shù):無(wú)

  173. * 出口參數(shù):無(wú)

  174. * 說(shuō) 明:發(fā)送ui8TX_buffer數(shù)組中的數(shù)據(jù),發(fā)送完成后,置位bTX_finished標(biāo)志位,下一次進(jìn)入中斷后關(guān)閉發(fā)送

  175. * 范 例:無(wú)

  176. ******************************************************************************************************/


  177. #pragma vector=USART_T_TXE_vector

  178. __interrupt void USART_TX_ISR (void)

  179. {

  180.   static uint8_t cnts=0;

  181.   if(bTX_finished && USART1_SR_TC==1)

  182.   {

  183.     bTX_finished=false;

  184.     USART1_CR2_TIEN=0;//關(guān)閉發(fā)送中斷

  185.     USART1_CR2_TEN=0;//關(guān)閉發(fā)送

  186.   }

  187.   else if(USART1_SR_TC==1)

  188.   {

  189.     USART1_DR=ui8TX_buffer[cnts++];

  190.     if(cnts==ui8TX_number)

  191.     {

  192.       cnts=0;

  193.       bTX_finished=true;

  194.     }

  195.   }

  196. }

  197. /******************************************************************************************************

  198. * 名               稱: UART_OnRx()

  199. * 功         能: UART的Tx事件處理函數(shù)

  200. * 入口           參數(shù):無(wú)

  201. * 出口           參數(shù):無(wú)

  202. * 說(shuō)               明:

  203. * 范              例:無(wú)

  204. ******************************************************************************************************/

  205. #pragma vector=USART_R_RXNE_vector

  206. __interrupt void USART_RX_ISR(void)

  207. {

  208.   static uint8_t ui8RX_temp=0;

  209.   if(USART1_SR_RXNE==1)

  210.   {

  211.     ui8RX_temp = USART1_DR;

  212.   }

  213. }
復(fù)制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表