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
View Code

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 }
View Code

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
View Code

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 }
View Code

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
View Code

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 }
View Code

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 }
View Code

实验源码:

链接:https://pan.baidu.com/s/1hy2rUMvwOXTMcwX6nUg3QQ
提取码:ua1m 

---恢复内容结束---

猜你喜欢

转载自www.cnblogs.com/QSHL/p/10853004.html