这是我使用标准库写的,通过定时器触发ADC采样,然后通过DMA进行传输的例程。例程已在STM32F407上验证通过
单片机源程序如下:
- /*需要按下复位键才能正常打印数据,原因不明
- 定时器1s触发一次ADC转换,然后通过DMA将ADC转换的数据搬运到内存中,然后在dma中断中判断搬运是否完成,在main
- 的循环中不断读取转换的值-----取采样数据的平均值的代码可以参考原子的
- 要注意的是,这里采用的是定时器1通道1上升沿触发,而数据有8个,若每1s触发一次,则需要每8s才能显示一次转换的数据,因此将定时器触发时间改为了1/8s*/
- //#include "stm32f4xx.h"
- #include "usart_printf.h"
- #include "bsp_systick.h"
- #include "bsp_led.h"
- #include "ADC.h"
- #include "DMA.h"
- #include "Timer.h"
- RCC_ClocksTypeDef get_rcc_clock;
- __IO uint16_t ADC_RegularConvertedValueTab[8] = {0};
- //这里可以使用两种定时器触发模式,一种是TIM2 CH2对应PA1,一种是TIM_CH1对应PA8
- u8 flag=0;
- /*软件复位*/
- //void mcuRestart(void)
- //{
- //__set_FAULTMASK(1); //关闭所有中断
- //NVIC_SystemReset(); //复位
- //}
- int main(void)
- {
- // mcuRestart();
- usart_Init ();
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- TIM1_PWM_Init();
- ADC_Configuration();
- DMA2_Init();
- printf("这是一个测试\r\n");
- RCC_GetClocksFreq(&get_rcc_clock);
- while (1)
- {
- if(flag)
- {
- flag=0;
- for(int i=0;i<8;i++)
- {
- printf("%d ",ADC_RegularConvertedValueTab[i]);
- }
- }
- }
- }
复制代码
所有资料51hei提供下载:
TIM+ADC+DMA实验.7z
(592.7 KB, 下载次数: 330)
|