一、准备工作:
有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32+HAL】CUBEMX初始化配置
二、所用工具:
1、芯片: STM32F407ZGT6
2、STM32CubeMx软件
3、IDE: MDK-Keil软件
4、STM32F4xxHAL库
三、实现功能:
ADC采集波形并通过上位机显示
四、HAL库配置 (初始配置完成):
1、开启ADC
(可以先试试软件触发模式)
2、开启DAC以输出波形
有关DAC的详细配置,请参见【STM32+HAL】DAC+DMA输出波形实现
3、ADC定时器开启
PSC,ARR将决定采样频率,采样频率越高可采集的波形频率越高
4、DAC定时器开启
5、全局定时器开启
以周期1s闪烁LED灯
6、中断配置(不唯一)
至此,CUBEMX配置完成
五、KEIL填写代码:
1、初始化DAC,ADC
#define MAX_SAMP 1024
uint16_t adc1[MAX_SAMP]={0};
int flag=1,flag1=1;
HAL_TIM_Base_Start(&htim2);
HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
HAL_TIM_Base_Start(&htim8);
HAL_TIM_Base_Start_IT((TIM_HandleTypeDef *)&htim1);
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc1,MAX_SAMP);
printf("Hello World!\r\n");
HAL_Delay(500);
2、ADC回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) //ADC中断
{
if(hadc->Instance==hadc1.Instance){
HAL_TIM_Base_Stop(&htim8);
flag1=1;
}
}
3、定时器TIM1中断
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if ( htim -> Instance == TIM1 ){
HAL_GPIO_TogglePin(GPIOF,LED_Pin);
}
}
4、main.c
while (1)
{
if(flag&&flag1){
flag1=0;
for(int i=0;i<MAX_SAMP;i++) printf("%d\n",adc1[i]);
HAL_TIM_Base_Start(&htim8);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
六、VOFA+上位机配置
至此,只要在主函数中写printf("%d,%d\n",xx1,xx2);即可输出数据
七、巨人之肩
【STM32】HAL库 STM32CubeMX教程九---ADC