STM32 DAC(数据中断处理方式)学习笔记
开发板:野火指南者(STM32F103VE)
STM32库版本:STM32F10x_StdPeriph_Lib_V3.5.0
IDE:KEIL5(代码编写很不方便,只在编译的时候用到)
代码编写工具:Source Insight 4.0(跟读代码、编写代码的最佳工具)
硬件原理图:
效果:
1. 新建user_adc.c、user_adc.h、user_nvic.c、user_nvic.h、user_usart.c、user_usart.h、main.c 7个文件,并从STM32官方库的例子中将stm32f10x_it.c、stm32f10x_it.h、stm32f10x_conf.h拷贝到自己的工程目录下。
2. 在user_adc.h中添加如下代码
1 #ifndef __USER_ADC_H 2 #define __USRE_ADC_H 3 #include "stm32f10x.h" 4 5 6 extern float adc_var; 7 8 void user_adc_config(void); //ADC配置函数 9 void user_adc_gpio_config(void); //配置实际信号输入通道的IO 10 void ADC1_2_IRQHandler(void); //中断函数,函数名要与.s启动文件中的中断向量表一致 11 void user_delay_time(uint32_t time); //延时函数 12 13 14 #endif
3. 在user_adc.c中添加如下代码
1 #include "user_adc.h" 2 3 float adc_var; 4 5 //ADC配置函数 6 void user_adc_config(void) 7 { 8 9 ADC_InitTypeDef adc_config; 10 11 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); 12 13 adc_config.ADC_ContinuousConvMode = ENABLE; 14 adc_config.ADC_DataAlign = ADC_DataAlign_Right; 15 adc_config.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; 16 adc_config.ADC_Mode = ADC_Mode_Independent; 17 adc_config.ADC_NbrOfChannel = 1; 18 adc_config.ADC_ScanConvMode = DISABLE; 19 20 ADC_Init(ADC1, &adc_config); 21 22 RCC_ADCCLKConfig(RCC_PCLK2_Div8); 23 24 //ADC_Channel_11为信号输入通道,ADC1对应到的是IO PC1,即实际通道,对照表查阅书本Page378 25 ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5); 26 27 //开启ADC1中断 28 ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE); 29 30 ADC_Cmd(ADC1, ENABLE); 31 32 ADC_ResetCalibration(ADC1); 33 while(ADC_GetResetCalibrationStatus(ADC1)); 34 35 36 ADC_StartCalibration(ADC1); 37 while(ADC_GetCalibrationStatus(ADC1)); 38 39 ADC_SoftwareStartConvCmd(ADC1, ENABLE); 40 41 } 42 43 44 //配置实际信号输入通道的IO 45 void user_adc_gpio_config(void) 46 { 47 GPIO_InitTypeDef adc_pc1_config; 48 49 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); 50 51 adc_pc1_config.GPIO_Mode = GPIO_Mode_AIN; 52 adc_pc1_config.GPIO_Pin = GPIO_Pin_1; 53 54 GPIO_Init(GPIOC, &adc_pc1_config); 55 56 57 } 58 59 //延时函数 60 void user_delay_time(uint32_t time) 61 { 62 while(time--); 63 } 64 65 //中断函数,函数名要与.s启动文件中的中断向量表一致 66 void ADC1_2_IRQHandler(void) 67 { 68 69 70 if(ADC_GetITStatus(ADC1, ADC_IT_EOC) == SET) 71 { 72 adc_var = ADC_GetConversionValue(ADC1); 73 } 74 75 ADC_ClearITPendingBit(ADC1, ADC_IT_EOC); 76 77 }
4. 在user_nvic.h中添加如下代码
1 #ifndef __USER_NVIC_H 2 #define __USER_NVIC_H 3 #include "stm32f10x.h" 4 5 6 void user_nvic_config(void); //中断配置函数 7 8 #endif
5. 在user_nvic.c中添加如下代码
1 #include "user_nvic.h" 2 3 4 //中断配置函数 5 void user_nvic_config(void) 6 { 7 NVIC_InitTypeDef nvic_config; 8 9 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 10 11 nvic_config.NVIC_IRQChannel = ADC1_2_IRQn; 12 nvic_config.NVIC_IRQChannelCmd = ENABLE; 13 nvic_config.NVIC_IRQChannelPreemptionPriority = 1; 14 nvic_config.NVIC_IRQChannelSubPriority = 1; 15 16 NVIC_Init(&nvic_config); 17 18 }
6. 在user_usart.h中添加如下代码
1 #ifndef __USER_USART_H 2 #define __USER_USART_H 3 4 #include "stdio.h" 5 #include "stm32f10x.h" 6 7 void user_USART_GPIO_Config(void); //UASRT TX、RX GPIO配置 8 void user_USART_Config(void); //USART配置 9 int fputc(int data, FILE * f); //重写fputc,使printf函数定向到USART 10 int fgetc(FILE * f); //重写fgetc,使scanf函数定向到USART 11 12 13 14 #endif
7. 在user_usart.c中添加如下代码
1 #include "user_usart.h" 2 3 //UASRT TX、RX GPIO配置 4 void user_USART_GPIO_Config(void) 5 { 6 GPIO_InitTypeDef USART_TX_PA9,USART_RX_PA10; 7 8 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 9 10 USART_TX_PA9.GPIO_Mode = GPIO_Mode_AF_PP; 11 USART_TX_PA9.GPIO_Pin = GPIO_Pin_9; 12 USART_TX_PA9.GPIO_Speed = GPIO_Speed_50MHz; 13 14 USART_RX_PA10.GPIO_Mode = GPIO_Mode_IN_FLOATING; 15 USART_RX_PA10.GPIO_Pin = GPIO_Pin_10; 16 17 GPIO_Init(GPIOA, &USART_TX_PA9); 18 GPIO_Init(GPIOA, &USART_RX_PA10); 19 } 20 21 22 //USART配置 23 void user_USART_Config(void) 24 { 25 USART_InitTypeDef USART_Config; 26 27 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); 28 29 USART_Config.USART_BaudRate = 115200; 30 USART_Config.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 31 USART_Config.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; 32 USART_Config.USART_Parity = USART_Parity_No; 33 USART_Config.USART_StopBits = USART_StopBits_1; 34 USART_Config.USART_WordLength = USART_WordLength_8b; 35 36 USART_Init(USART1, &USART_Config); 37 38 USART_Cmd(USART1, ENABLE); 39 40 41 } 42 43 //重写fputc,使printf函数定向到USART 44 int fputc(int data, FILE * f) 45 { 46 USART_SendData(USART1, (uint8_t)data); 47 48 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) 49 { 50 51 } 52 53 return data; 54 } 55 56 57 58 //重写fgetc,使scanf函数定向到USART 59 int fgetc(FILE * f) 60 { 61 while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) 62 { 63 64 } 65 66 return (int)USART_ReceiveData(USART1); 67 }
8. 在mian.c中添加如下代码
1 #include "stm32f10x.h" 2 #include "user_nvic.h" 3 #include "user_adc.h" 4 #include "user_usart.h" 5 6 extern float adc_var; 7 8 9 int main(void) 10 { 11 float adc_val = 0; 12 13 user_USART_GPIO_Config(); 14 user_USART_Config(); 15 user_nvic_config(); 16 user_adc_gpio_config(); 17 user_adc_config(); 18 19 20 21 printf("===============ADC TEST==================\n"); 22 23 while(1) 24 { 25 adc_val = adc_var * (3.3 / 4096); 26 27 printf("the adc_val is %f\n",adc_val); 28 29 user_delay_time(0xff0000); 30 } 31 32 33 34 }
实验源码:
链接:https://pan.baidu.com/s/1hy2rUMvwOXTMcwX6nUg3QQ
提取码:ua1m
---恢复内容结束---