久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM8L的DMA詳解 含例程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140343 發(fā)表于 2016-10-10 00:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
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請求,獨(dú)立傳送數(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ù)制代碼




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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美一区二区三区在线看 | 日韩一区二区三区四区五区六区 | 日韩国产一区 | 亚洲精品麻豆 | 91亚洲精品在线观看 | 国产精品精品3d动漫 | 久久久久一区 | 国产伦精品一区二区三区高清 | 一区二区三区中文字幕 | 免费簧片视频 | 99久久婷婷 | 日韩高清一区 | 国产精品一区二区三区在线 | 成人不卡 | av片在线免费看 | 免费v片在线观看 | 亚洲高清免费 | 一级大片免费 | 欧美视频网 | 久久99网 | aaa大片免费观看 | 在线色 | 成人精品鲁一区一区二区 | 999久久久久久久久6666 | 91视频网址 | 亚洲成人午夜在线 | 天天爽夜夜爽精品视频婷婷 | 九色在线视频 | 久久精品一区 | 色网站在线 | 欧美在线亚洲 | 成人在线观看欧美 | 人人人干| 中文字幕日韩一区 | 久久精彩视频 | 亚洲精品免费在线观看 | 日韩精品极品视频在线观看免费 | 欧美亚洲综合久久 | 伊人网综合在线 | 亚洲欧洲中文 | 欧美区日韩区 |