你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103VET6 定时器捕捉跳变沿触发DMA读取端口信息

[复制链接]
mengyu139 提问时间:2014-11-11 16:23 /
  1. /******************** (C) COPYRIGHT 2012 WildFire Team **************************
  2. by mengyu
  3. IM3_CH1 (PA.6) as capture
  4. **********************************************************************************/
  5. #include "stm32f10x.h"
  6. #include "stm32f10x_conf.h "

  7. void Delay(__IO u32 nCount);
  8. void PA8_INIT(void);
  9. void NVIC_Configuration(void);
  10. void GPIO_Configuration(void);
  11. void RCC_Configuration(void);
  12. void TIM_CAP_init(void);
  13. void GPIOE_IN_Init(void);
  14. void DMA_Port_to_ram_init(void);

  15. uint16_t COUNT = 0;
  16. uint16_t PORT_IN;
  17. int main(void)
  18. {       
  19.          /* System Clocks Configuration */
  20.   RCC_Configuration();

  21.   /* NVIC configuration */
  22.   NVIC_Configuration();

  23.   /* Configure the GPIO ports */
  24.   GPIO_Configuration();
  25.        
  26.         PA8_INIT();
  27.   GPIOE_IN_Init();
  28.        
  29.   DMA_Port_to_ram_init();
  30.        
  31.         TIM_CAP_init();
  32.         while (1)
  33.         {       
  34.                
  35.                
  36.                 Delay(2000);
  37.                 GPIO_SetBits(GPIOA, GPIO_Pin_8);
  38.                 Delay(2000);
  39.                 GPIO_ResetBits(GPIOA, GPIO_Pin_8);
  40.                 Delay(2000);
  41.                 GPIO_SetBits(GPIOA, GPIO_Pin_8);
  42.                 Delay(2000);
  43.                 GPIO_ResetBits(GPIOA, GPIO_Pin_8);
  44.                
  45.         }
  46. }

  47. void Delay(__IO u32 nCount)         //简单的延时函数
  48. {
  49.         for(; nCount != 0; nCount--);
  50. }





  51. void PA8_INIT(void)
  52. {               
  53.         /*定义一个GPIO_InitTypeDef类型的结构体*/
  54.         GPIO_InitTypeDef GPIO_InitStructure;

  55.         /*开启GPIOA的外设时钟*/
  56.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);

  57.         /*选择要控制的GPIOA8引脚*/                                                                                                                          
  58.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

  59.         /*设置引脚模式为通用推挽输出*/
  60.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

  61.         /*设置引脚速率为50MHz */   
  62.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  63.         /*调用库函数,初始化GPIOA*/
  64.           GPIO_Init(GPIOA, &GPIO_InitStructure);                  

  65.         /* 关闭所有led灯        */
  66.         GPIO_SetBits(GPIOA, GPIO_Pin_8);         
  67. }

  68. void NVIC_Configuration(void)
  69. {
  70.   NVIC_InitTypeDef NVIC_InitStructure;

  71.   /* Enable the TIM3 global Interrupt */
  72.   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  73.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  74.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  75.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  76.   NVIC_Init(&NVIC_InitStructure);
  77. }
  78. void GPIO_Configuration(void)
  79. {
  80.   GPIO_InitTypeDef GPIO_InitStructure;

  81.   /* TIM3 channel 1 pin (PA.06) configuration */
  82.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  83.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  84.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  85.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  86. }

  87. void RCC_Configuration(void)
  88. {
  89.   /* TIM3 clock enable */
  90.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  91.   /* GPIOA and GPIOB clock enable */
  92.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
  93. }

  94. void TIM_CAP_init(void)
  95. {
  96.         TIM_ICInitTypeDef  TIM_ICInitStructure;
  97.        
  98.         TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
  99.   TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  100.   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  101.   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  102.   TIM_ICInitStructure.TIM_ICFilter = 0x0;

  103.   TIM_ICInit(TIM3, &TIM_ICInitStructure);
  104.   
  105.         TIM_DMACmd(TIM3, TIM_DMA_CC1, ENABLE); //ENABLE cc1 trig dma
  106.        
  107.   /* TIM enable counter */
  108.   TIM_Cmd(TIM3, ENABLE);

  109.   /* ENABLE the CC1 Interrupt Request */
  110.   TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
  111. }

  112. void DMA_Port_to_ram_init(void)
  113. {
  114.         DMA_InitTypeDef DMA_InitStructure;
  115.        
  116. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  117.        
  118.         /* DMA channel1 configuration */
  119.         DMA_DeInit(DMA1_Channel6);
  120.         DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&GPIOE->IDR; //(0x40011400 + 0X08);         //portD  
  121.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&PORT_IN;//内存地址
  122.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  123.         DMA_InitStructure.DMA_BufferSize = 1;
  124.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址固定
  125.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;  //内存地址固定
  126.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;        //16
  127.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//16
  128.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                //循环传输
  129.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  130.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  131.         DMA_Init(DMA1_Channel6, &DMA_InitStructure);
  132.        
  133.         /* Enable DMA channel_6*/
  134.         DMA_Cmd(DMA1_Channel6, ENABLE);
  135. }

  136. void GPIOE_IN_Init(void)
  137. {
  138.                 GPIO_InitTypeDef GPIO_InitStructure;

  139.          RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE, ENABLE);
  140.         /*选择要控制的GPIOE引脚*/                                                                                                                          
  141.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;       

  142.         /*设置引脚模式为上拉或者下拉输入*/
  143.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;   

  144.         /*设置引脚速率为50MHz */   
  145.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  146.         /*调用库函数,初始化GPIOC*/
  147.           GPIO_Init(GPIOE, &GPIO_InitStructure);               
  148. }




  149. /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/
复制代码


收藏 评论3 发布时间:2014-11-11 16:23

举报

3个回答
mengyu139 回答时间:2014-11-11 16:25:24
捕获.JPG
mengyu139 回答时间:2014-11-11 16:25:50
不是所有的定时器都能完成DMA触发
沐紫 回答时间:2014-11-11 17:10:43
多谢楼主!
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版