小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

STM8L的DMA詳解 含例程

 心不留意外塵 2017-03-25
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ù)。



  1. /*硬件連接*/

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

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

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

  5. *硬件平臺:STM8L-DISCOVERY

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

  7. *         對比.

  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. *  功    能:延時10ms

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

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

  27. *  說    明:

  28. *  范    例:無

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

  30. void delay_100ms(void)

  31. {

  32.   uint8_t i,j;

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

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

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

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

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

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

  39. }

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

  41. *  名    稱:void GPIO_Init(void)

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

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

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

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

  46. *  范    例:無

  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定時器初始化系統(tǒng)

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

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

  60. * 說       明:UART初始化為 9600 1 8 n

  61. * 范      例:無

  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è)置,會莫名奇妙的發(fā)送0x00

  74.    


  75.     CLK_PCKENR1_PCKEN15=1;//開啟USART外設(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ā)送接收引腳,請在這里選擇

  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是此時系統(tǒng)的主時鐘頻率,默認(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. *  功    能:啟用DMA

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

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

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

  106. *  范    例:無

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

  108. void DMA_Config(void)

  109. {

  110.   //------打開DAM時鐘------

  111.   CLK_PCKENR2_PCKEN24=1;

  112.   

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

  114.   DMA1_C1NDTR=9;  

  115.   

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

  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ù):無

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

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

  175. * 范 例:無

  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ù):無

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

  202. * 說               明:

  203. * 范              例:無

  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ù)制代碼




    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多