STM32八路ADC采用DMA方式
作者:互联网
#include "adc.h"
#include "sys.h"
#define ADC1_DR_Address ((u32)0x4001244C)
__IO u16 ADC_ConvertedValue;
/*配置采样通道端口 使能GPIO时钟 设置ADC采样PA0端口信号*/
void ADC1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //GPIO设置为模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*配置ADC1的工作模式为MDA模式 */
void ADC1_Mode_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能MDA1时钟
/* DMA channel1 configuration */
DMA_DeInit(DMA1_Channel1); //指定DMA通道
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;////ADC1地址---代表ADC1保存转换值的寄存器
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //设置DMA内存地址,ADC转换结果直接放入该地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设为设置为数据传输的来源
DMA_InitStructure.DMA_BufferSize = 16; //传输总数据---2通道需要传输2个数据
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增---总体表示始终从外设ADC1地址处取值---依次保存到连续的两个内存变量中---
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //内存传输数据单元---半字16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循环模式---2个数据依次循环接收从外设ADC1传输过来的ADC值---
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
/* Enable DMA channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE); //使能DMA通道
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟
/* ADC1 configuration */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //使用独立模式,扫描模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //模数转换工作在扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换使用软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //使用数据右对齐
// ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Left; //使用数据左对齐
ADC_InitStructure.ADC_NbrOfChannel =8; // ADC转换通道个数
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channel11 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //通道1采样周期55.5个时钟周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 8, ADC_SampleTime_55Cycles5);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE); //使能ADC的DMA
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE); //使能ADC1
/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1); //复位校准
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开始转换
}
/*初始化ADC1 */
void ADC1_Init(void)
{
ADC1_GPIO_Config();
ADC1_Mode_Config();
}
#ifndef __ADC_H
#define __ADC_H
#include "stm32f10x.h"
void ADC1_Init(void);
#endif /* __ADC_H */
//#include "led.h"
//#include "delay.h"
//#include "key.h"
//#include "sys.h"
//#include "lcd.h"
//#include "usart.h"
//#include "ds18b20.h"
//#include "adc.h"
//
///************************************************
// ALIENTEK战舰STM32开发板实验30
// DS18B20数字温度传感器 实验
// 技术支持:www.openedv.com
// 淘宝店铺:http://eboard.taobao.com
// 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
// 广州市星翼电子科技有限公司
// 作者:正点原子 @ALIENTEK
//************************************************/
//extern __IO u16 ADC_ConvertedValue[5];
//void SoftReset(void) //软件复位
//{
// __set_FAULTMASK(1); // 关闭所有中断
// NVIC_SystemReset(); // 复位
//}
// int main(void)
// {
// u8 t=0;
// short temperature;
// delay_init(); //延时函数初始化
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
// uart_init(115200); //串口初始化为 115200
// LED_Init(); //初始化与LED连接的硬件接口
// LCD_Init(); //初始化LCD
// ADC1_Init(); //ad检测的初始化
// POINT_COLOR=RED; //设置字体为红色
// LCD_ShowString(90,20,200,24,24,"SIAS");
// LCD_ShowString(30,260,200,16,16,"DHT11 OK");
// POINT_COLOR=BLUE;//设置字体为蓝色
// LCD_ShowString(30,280,200,16,16,"Temp: C");
// LCD_ShowString(30,300,200,16,16,"Humi: %");
//
// //显示时间
// POINT_COLOR=BLUE;//设置字体为蓝色
// LCD_ShowString(120,280,200,16,16,"2018-10-26");
// LCD_ShowString(140,300,200,16,16," : : ");
//
// while(DS18B20_Init()) //DS18B20初始化
// {
// LCD_ShowString(30,130,200,16,16,"DS18B20 Error");
// delay_ms(200);
// LCD_Fill(30,130,239,130+16,WHITE);
// delay_ms(200);
// }
// LCD_ShowString(30,130,200,16,16,"DS18B20 OK");
// POINT_COLOR=BLUE;//设置字体为蓝色
// LCD_ShowString(30,150,200,16,16,"Temp: . C");
// while(1)
// {
// POINT_COLOR=DARKBLUE ;
// //PA3的adc显示 ;
// LCD_ShowString(10,40,200,16,16,"PA3: %");
// LCD_ShowNum(30+16,40,ADC_ConvertedValue[3],4,16); //显示ADC
// if(0==0) //每100ms读取一次
// {
// temperature=DS18B20_Get_Temp();
// if(temperature<0)
// {
// LCD_ShowChar(30+40,150,'-',16,0); //显示负号
// temperature=-temperature; //转为正数
// }else LCD_ShowChar(30+40,150,' ',16,0); //去掉负号
// LCD_ShowNum(30+40+8,150,temperature/10,2,16); //显示正数部分
// LCD_ShowNum(30+40+32,150,temperature%10,1,16); //显示小数部分
// }
// delay_ms(10);
// t++;
// if(t==20)
// {
// t=0;
// LED0=!LED0;
// }
// }
//}
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
//#include "usart2.h"//串口2
#include "dht11.h"
//#include "usmart.h" //串口调试组件
#include "rtc.h"
#include "usart3.h"//串口三
#include "adc.h"
#include "ds18b20.h"
#include "oled.h"
//#include "MOTO.h"
#include "timer.h"
#include "beep.h"
#include "buttom.h"
u8 usar_buff[30];
extern __IO u16 ADC_ConvertedValue[8];
void SoftReset(void) //软件复位
{
__set_FAULTMASK(1); // 关闭所有中断
NVIC_SystemReset(); // 复位
}
//void a_PWMces(pwm1,pwm2) //PB0 , PB5
//{
// //TIM_OC2Init TIM_OC3Init
// //TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
// TIM_SetCompare3(TIM3,899-pwm1); //左
// TIM_SetCompare2(TIM3,899-pwm2); //右
//}
void zijidelay(u16 x, u16 i)
{
for(i=0;i<x;i++)
{
delay_ms(x);
}
}
//连接WIFI
//格式 AT+CWJAP="WEIDAWEI2.4G","4444333221"
void WIFI_INIT(u16 WIFI_ID ,u16 WIFI_Passward)
{
// printf("{\"M\":\"checkin\",\"ID\":\"");
// printf("%d",WIFI);
// printf("\",\"K\":\"");
// printf("%d",\"password \");
// printf("\"}\n");
printf("AT+CWJAP=\"");
printf("%d",WIFI_ID);
printf("\",\"");
printf("%d",WIFI_Passward);
printf("\"\r\n");
}
//上传数据
// 上传设备的 ID 数据接口的ID 传输的数据
void updata(u16 ID ,u16 kpi1,u16 shu1,u16 kpi2,u16 shu2 ,u16 kpi3,u16 shu3,u16 kpi4,u16 shu4 ,u16 kpi5,u16 shu5,u16 kpi6,u16 shu6,u16 kpi7,u16 shu7,u16 kpi8,u16 shu8)
{
printf("{\"M\":\"update\",\"ID\":\"");
printf("%d",ID);//上传设备的ID 5887
printf("\",\"V\":{\"");
printf("%d",kpi1);//接口数据的id 5225
printf("\":\"");
printf("%0.2d",shu1);//开始发送一个数据 65.75
printf("\",\"");
printf("%d",kpi2);//接口数据的id 5445
printf("\":\"");
printf("%d",shu2);//开始发送一个数据 pa5
printf("\",\"");
printf("%d",kpi3);//接口数据的id 5445
printf("\":\"");
printf("%d",shu3);//开始发送一个数据 pa5
printf("\",\"");
printf("%d",kpi4);//接口数据的id 5445
printf("\":\"");
printf("%d",shu4);//开始发送一个数据 pa5
printf("\",\"");
printf("%d",kpi5);//接口数据的id 5445
printf("\":\"");
printf("%d",shu5);//开始发送一个数据 pa5
printf("\",\"");
printf("%d",kpi6);//接口数据的id 5445
printf("\":\"");
printf("%d",shu6);//开始发送一个数据 pa5
printf("\",\"");
printf("%d",kpi7);//接口数据的id 5445
printf("\":\"");
printf("%d",shu7);//开始发送一个数据 pa5
printf("\",\"");
printf("%d",kpi8);//接口数据的id 5445
printf("\":\"");
printf("%d",shu8);//开始发送一个数据 pa5
// printf("\",\"");
printf("\"}}\n");
}
int main(void)
{
vu8 key=0; //定义的按键值
u8 len;
u8 t=0;
u8 j=0;
u8 l=0;
u8 anjianzhi=0;//定义按键值
u8 flag=0;// 设置标志位
// u8 *x;
u32 shuju1;
short shuju2;
short shuju3;
short shuju4;
short shuju5;
short shuju6;
short shuju7;
short shuju8;
// short temperature;
delay_init(); //延时函数初始化
OLED_Init(); //初始化OLED
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为 115200
LED_Init(); //初始化与LED连接的硬件接口
ADC1_Init();
KEY_Init(); //初始化与按键连接的硬件接口
beike_INIT(); //登录指令
TIM3_PWM_Init(899,0);
BEEP_Init();
buttom_Init();
USART3_Init(115200);
while(1)
{
//PA7的adc显示 ; 水滴 改为温度传感器
OLED_ShowString(64,6,"NTCDH",16); //字体的位数
// OLED_ShowNum(64+32,6,ADC_ConvertedValue[7],4,16);//显示ASCII字符
// shuju8=ADC_ConvertedValue[7];
shuju8=(((4096-ADC_ConvertedValue[7])/99));
// if (ADC_ConvertedValue[7]>2600)
// {
// shuju8=70-((3500-ADC_ConvertedValue[7])/250);
if(shuju8>23)
{
BEEP=1;
buttom=0;
zijidelay(10,10);
buttom=0;
BEEP=0;
}else buttom=1;
//
// }
OLED_ShowNum(64+32,6,shuju8,4,16);
//PA6的adc显示 ;//液位
OLED_ShowString(0,6,"H20:",16); //字体的位数
shuju7=(ADC_ConvertedValue[6]);
OLED_ShowNum(32,6,shuju7,4,16);
// OLED_ShowNum(32,6,ADC_ConvertedValue[7],4,16);//显示ASCII字符的码值
//PA5的adc显示 ; 变为空气质量传感器 氨气硫化物 苯系蒸汽
OLED_ShowString(64,4,"PPM",16); //字体的位数
// OLED_ShowNum(64+32,4,ADC_ConvertedValue[5],4,16);//显示ASCII字符的码值
shuju6=(ADC_ConvertedValue[5]*256)/4096;
OLED_ShowNum(64+32,4,shuju6,4,16);
// zijidelay(100,100);
//PA4的adc显示 ; 烟雾 可燃气体 烟雾
OLED_ShowString(0,4,"CH4:",16); //字体的位数
// OLED_ShowNum(32,4,ADC_ConvertedValue[4],4,16);//显示ASCII字符的码值
shuju5=ADC_ConvertedValue[4];
OLED_ShowNum(32,4,shuju5,4,16);//显示ASCII字符的码值
//PA3的adc显示 ; 火焰传感器
OLED_ShowString(64,2,"huo:",16); //字体的位数
// OLED_ShowNum(64+32,2,ADC_ConvertedValue[3],4,16);//显示ASCII字符的码值
shuju4=(ADC_ConvertedValue[3]-ADC_ConvertedValue[3]);
if((4096-ADC_ConvertedValue[3])>3000)
{
shuju4=ADC_ConvertedValue[3];
}
OLED_ShowNum(64+32,2,shuju4,4,16);
//发送的数据的格式解析 {"M":"update","ID":"7645","V":{"6719":"10"}}
//加入转义字符
// printf("{\"M\":\"update\",\"ID\":\"7645\",\"V\":{\"6719\":\"10\"}}");
// printf("%d",ADC_ConvertedValue[3]);
// printf("\r\n\r\n");//插入换行
// LCD_ShowNum(30+24,40,ADC_ConvertedValue[3]/16%100/10,1,16); //显示ADC
// LCD_ShowNum(30+32,40,ADC_ConvertedValue[3]/16%100%10,1,16); //显示ADC
//PA2的adc显示 声音
OLED_ShowString(0,2,"dB:",16); //字体的位数
// OLED_ShowNum(32,2,ADC_ConvertedValue[2],4,16);//显示ASCII字符的码值
shuju3=4096-ADC_ConvertedValue[2];
OLED_ShowNum(32,2,shuju3,4,16);//显示ASCII字符的码值
// LCD_ShowNum(30+24,60,ADC_ConvertedValue[2]/16%100/10,1,16); //显示ADC
// LCD_ShowNum(30+32,60,ADC_ConvertedValue[2]/16%100%10,1,16); //显示ADC
//PA1的adc显示 光照2
OLED_ShowString(64,0,"LUX:",16); //字体的位数
// OLED_ShowNum(64+32,0,ADC_ConvertedValue[1],4,16);//显示ASCII字符的码值
shuju2=80-(ADC_ConvertedValue[1]*0.025);
OLED_ShowNum(64+32,0,shuju2,4,16);
// LCD_ShowNum(30+16,80,ADC_ConvertedValue[1]/16/100,1,16); //显示ADC
// LCD_ShowNum(30+24,80,ADC_ConvertedValue[1]/16%100/10,1,16); //显示ADC
// LCD_ShowNum(30+32,80,ADC_ConvertedValue[1]/16%100%10,1,16); //显示ADC
//PA0的adc显示 光照1
OLED_ShowString(0,0,"LUX:",16); //字体的位数
// OLED_ShowNum(32,0,ADC_ConvertedValue[0],4,16);//显示ASCII字符的码值
shuju1=80-(ADC_ConvertedValue[0]*0.025);
// shuju1=shuju1
OLED_ShowNum(32,0,shuju1,4,16);//显示ASCII字符的码值
delay_ms(300); // 读取刷新的数据
t++;
//a[8]={shuju1,shuju2,shuju3,shuju4,shuju5,shuju6,shuju7,shuju8};
// USART3_Sned_Char_Buff(USART_RX_BUF,8);
//测试发送数据 串口三的波特率115200 测试 发送数据 一定要发送十二个
// USART3_Sned_Char('1');
// USART3_Sned_Char('+');
// USART3_Sned_Char('1');
// USART3_Sned_Char('+');
// USART3_Sned_Char('1');
// USART3_Sned_Char('+');
// USART3_Sned_Char('1');
// USART3_Sned_Char('+');
// USART3_Sned_Char('1');
// USART3_Sned_Char('+');
// USART3_Sned_Char('1');
// USART3_Sned_Char('+');
// USART3_Sned_Char('1');
// USART3_Sned_Char('+');
// sprintf(usar_buff,"%d\r\n",anjianzhi);
// USART3_Sned_Char_Buff2(usar_buff);
sprintf(usar_buff,"%d",anjianzhi);
USART3_Sned_Char_Buff2(usar_buff);//定义第一个按键控制 0
USART3_Sned_Char('+');
sprintf(usar_buff,"%d",shuju1); //1 光照
USART3_Sned_Char_Buff2(usar_buff);
USART3_Sned_Char('+');
sprintf(usar_buff,"%d",shuju3);//2 噪音
USART3_Sned_Char_Buff2(usar_buff);
USART3_Sned_Char('+');
sprintf(usar_buff,"%d",shuju5); // 烟雾 3
USART3_Sned_Char_Buff2(usar_buff);//
USART3_Sned_Char('+');
sprintf(usar_buff,"%d",shuju6);// 空气质量 4
USART3_Sned_Char_Buff2(usar_buff);//
USART3_Sned_Char('+');
sprintf(usar_buff,"%d",shuju7);
USART3_Sned_Char_Buff2(usar_buff);//// 液位 5
USART3_Sned_Char('+');
USART3_Sned_Char('1');// 发送的数据为天气预报的数据 6
USART3_Sned_Char('+');
USART3_Sned_Char('1');// 天气预报的发送的数据为天气状态 7
USART3_Sned_Char('+');
USART3_Sned_Char('1');// 天气预报的风向 8
USART3_Sned_Char('+');
USART3_Sned_Char('1');// 天气预报的PM2.5 9
USART3_Sned_Char('+');
USART3_Sned_Char('1');// 天气预报的温度 10
USART3_Sned_Char('+');
sprintf(usar_buff,"%d\r\n",shuju8);
USART3_Sned_Char_Buff2(usar_buff); // NTC的 温度 11
//key=KEY_Scan(0); //得到键值
if(KEY0==0) //按键k0被按下 k0 E4
{
BEEP=1;
anjianzhi=1;
// BEEP=0;
// break;
flag++;
}
if(flag==2)
{
BEEP=0;
anjianzhi=0;
// BEEP=0;
// break;
flag=0;
}
// anjianzhi==0;
// USART3_Sned_Char(0x0a);
// USART3_Sned_Char(0x0d); //0x0d 0x0a 进行换行
// USART3_Sned_Char(/r/n);
//发送数据
if(t==30)
{
t=0;
//发送实际数据的间隔不得小于4秒
//{"M":"update","ID":"7645","V":{"6719":"10"}} 向设备发送数据
updata(2753,6859,shuju1,6858,shuju2,6769,shuju3,6768,shuju4,6766,shuju5,6719,shuju6,6283,shuju7,5325,shuju8);
}
// {"M":"isOL","ID":["D7022"]} 检测账号是否在线
// {"M":"isOL","R":{"D7022":"1"},"T":"1541584440"}如果账号不在线 则接受的数据
if(l==10)
{
// {"M":"isOL","ID":["D7022"]} 检测账号是否在线
printf("{\"M\":\"isOL\",\"ID\":[\"D2753\"]}\r\n");
delay_ms(5);
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3f;
if(len<50)
{
if(USART_RX_BUF[29]==1) //判断接受到的数据
{
printf("aa");
}
else
{
OLED_Clear();
beike_INIT();
}
}
USART_RX_STA=0;
}
}
j++;
if(j==10)
{
l++;
j=0;
delay_ms(10);
LED0=0;
LED1=1;
// delay_ms(50);
// OLED_Clear();
// OLED_ShowString(40,0, "SIAS",16);
// OLED_ShowString(40,2, "UPDATA OK",16);
// OLED_ShowString(40,4, "2015",16);
// OLED_ShowString(40,6, "WEIDAWEI2018/10/31",16);
// zijidelay(50,50);
LED0=1;
LED1=0;
delay_ms(10);
}
}
}
// LCD_ShowNum(30+16,100,ADC_ConvertedValue[0]/100,1,16); //显示ADC
// LCD_ShowNum(30+24,100,ADC_ConvertedValue[0]%100/10,1,16); //显示ADC
// LCD_ShowNum(30+32,100,ADC_ConvertedValue[0]%100%10,1,16); //显示ADC
// LCD_ShowString(30,70,200,24,24, USART_RX_BUF);
// USART_RX_STA=0;
// LCD_ShowString(30,90,200,16,16,"displaying results ");
// DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
// LCD_ShowNum(30+40,280,temperature,2,16); //显示温度
// LCD_ShowNum(30+40,300,humidity,2,16); //显示湿度
//// if(USART_RX_STA&0x8000)
//// {
//// len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
////// printf("\r\n您发送的消息为:\r\n\r\n");
//// for(t=0;t<len;t++)
//// {
//// USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据 发送给串口的数据
////
//// while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
//// }
//// printf("\r\n\r\n");//插入换行
//// USART_RX_STA=0;
//// }
// 可以实现校验清零
//00LCD_ShowChar(110,168,table[i],24,0); //显示字符串
// if(USART_RX_STA&0x8000)
// {
// len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
// printf("\r\n您发送的消息为:\r\n");
// for(t=0;t<len;t++)
// {
// USART_SendData(USART1, USART_RX_BUF[t]); //向串口1发送数据
// Tx_Buf[t]=USART_RX_BUF[t];
// while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
// }
//
// if(Tx_Buf[0]=='0')
// {
// shua++;
// // LCD_ShowString(60,148,200,24,24,"a ");
// LCD_ShowChar(80+i,148,table[i],24,0); //显示字符串
//
// }
// if(Tx_Buf[0]=='b')
// {
// LCD_ShowString(90,148,200,24,24,"b");
//
// }
// printf("\r\n\r\n");//插入换行
// USART_RX_STA=0;
// }
// i=USART_RX_BUF[0];
// delay_ms(100);
// for(i=0;i<30;i++)
//{
// delay_ms(1000);
// LCD_ShowChar(110,148,table[i],24,0); //显示字符串
//
//// LCD_ShowString(70,148,200,24,24,table[i]);
//
// if(Tx_Buf[0]=='0')
// {
// LCD_ShowString(60,148,200,24,24,"a ");
//
// }
//
//
//
// }
/***** **************
OLED_ShowString(35,0,"FuWei521",16); 行,列,字符串,字体
OLED_ShowNum(50,25,t,3,16); 行,列,数字,长度,字体
OLED_ShowChar(50,20,'d',12,1) 行,列,字符,字体,mode
OLED_ShowGBK(111,48,11,16,1); 行,列,gbk字库第几个,字体,mode
*********************/
// int main(void)
//{
// u8 t;
// u8 x; //数据的个数
// u8 Tx_Buf[8]; //要发送的数据
// // u8 t=0;
// u16 len;
// u8 temperature;
// u8 humidity;
// delay_init(); //延时函数初始化
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
// uart_init(115200); //串口初始化为115200
// LED_Init(); //LED端口初始化
// LCD_Init();
//// usmart_dev.init(SystemCoreClock/1000000); //初始化USMART
// RTC_Init(); //RTC初始化
// POINT_COLOR=RED; //设置字体为红色
// KEY_Init(); //初始化与按键连接的硬件接口
// DHT11_Init();
// //LCD_ShowString(30,190,200,16,16,USART_RX_BUF);
// while(DHT11_Init()) //DHT11初始化
// {
// LCD_ShowString(30,130,200,16,16,"DHT11 Error");
// delay_ms(200);
// LCD_Fill(30,130,239,130+16,WHITE);
// delay_ms(200);
// }
// LCD_ShowString(90,20,200,24,24,"SIAS");
// LCD_ShowString(30,260,200,16,16,"DHT11 OK");
// POINT_COLOR=BLUE;//设置字体为蓝色
// LCD_ShowString(30,280,200,16,16,"Temp: C");
// LCD_ShowString(30,300,200,16,16,"Humi: %");
//
// //显示时间
// POINT_COLOR=BLUE;//设置字体为蓝色
// LCD_ShowString(120,280,200,16,16,"2018-05-25");
// LCD_ShowString(140,300,200,16,16," : : ");
//
// while(1)
// {
//
//
// if(t!=calendar.sec)
// {
// t=calendar.sec;
//// LCD_ShowNum(140,280,calendar.w_year,4,16);
//// // LCD_ShowString(140,280,200,16,16,"");
//// LCD_ShowNum(180,280,calendar.w_month,2,16);
//// LCD_ShowNum(190,280,calendar.w_date,2,16);
//// switch(calendar.week)
//// {
//// case 0:
//// LCD_ShowString(60,148,200,16,16,"Sunday ");
//// break;
//// case 1:
//// LCD_ShowString(60,148,200,16,16,"Monday ");
//// break;
//// case 2:
//// LCD_ShowString(60,148,200,16,16,"Tuesday ");
//// break;
//// case 3:
//// LCD_ShowString(60,148,200,16,16,"Wednesday");
//// break;
//// case 4:
//// LCD_ShowString(60,148,200,16,16,"Thursday ");
//// break;
//// case 5:
//// LCD_ShowString(60,148,200,16,16,"Friday ");
//// break;
//// case 6:
//// LCD_ShowString(60,148,200,16,16,"Saturday ");
//// break;
// }
// LCD_ShowNum(140,300,calendar.hour,2,16);
// LCD_ShowNum(160,300,calendar.min,2,16);
// LCD_ShowNum(190,300,calendar.sec,2,16);
//// }
//
// POINT_COLOR=DARKBLUE ;
// LCD_ShowString(30,50,200,16,16,"The message you sent is");
// LCD_ShowString(30,70,200,24,24, USART_RX_BUF);
// USART_RX_STA=0;
// LCD_ShowString(30,90,200,16,16,"displaying results ");
// DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
// LCD_ShowNum(30+40,280,temperature,2,16); //显示温度
// LCD_ShowNum(30+40,300,humidity,2,16); //显示湿度
////// if(USART_RX_STA&0x8000)
////// {
////// len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
//////// printf("\r\n您发送的消息为:\r\n\r\n");
////// for(t=0;t<len;t++)
////// {
////// USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据 发送给串口的数据
//////
////// while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
////// }
////// printf("\r\n\r\n");//插入换行
////// USART_RX_STA=0;
////// }
//// 可以实现校验清零
// if(USART_RX_STA&0x8000)
// {
// len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
//
// printf("\r\n您发送的消息为:\r\n");
// for(t=0;t<len;t++)
// {
// USART_SendData(USART1, USART_RX_BUF[t]); //向串口1发送数据
// Tx_Buf[t]=USART_RX_BUF[t];
// while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
// }
//
// if(Tx_Buf[0]=='a')
// {
// LCD_ShowString(60,148,200,16,16,"Thursday ");
//
// }
//
//
// printf("\r\n\r\n");//插入换行
// USART_RX_STA=0;
//
// }
// LED0=!LED0;
// delay_ms(100);
// }
//}
//int main(void)
//{
//
// u8 Tx_Buf[8]; //要发送的数据
// u8 t;
// u16 len;
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
// delay_init(); //延时初始化
// uart_init(115200); //串口初始化波特率为115200
// LED_Init(); //初始化与LED连接的硬件接口
// //u8 t=0;
//
//
// delay_init(); //延时函数初始化
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
// uart_init(115200); //串口初始化为115200
// LED_Init(); //LED端口初始化
// LCD_Init();
// usmart_dev.init(SystemCoreClock/1000000); //初始化USMART
// RTC_Init(); //RTC初始化
// POINT_COLOR=RED; //设置字体为红色
// KEY_Init(); //初始化与按键连接的硬件接口
// DHT11_Init();
// while(1)
// {
//// 可以实现校验清零
// if(USART_RX_STA&0x8000)
// {
// len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
//
// printf("\r\n您发送的消息为:\r\n");
// for(t=0;t<len;t++)
// {
// USART_SendData(USART1, USART_RX_BUF[t]); //向串口1发送数据
// Tx_Buf[t]=USART_RX_BUF[t];
// while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
// }
//
// if(Tx_Buf[0]=='a'&&Tx_Buf[1]=='1')
// {
//
// LED0=!LED0;
// delay_ms(100);
// LCD_ShowString(60,148,200,16,16,"Thursday ");
//
// }
//
// printf("\r\n\r\n");//插入换行
// USART_RX_STA=0;
//
// }
//
// }
//
//}
//#include "led.h"
//#include "delay.h"
//#include "key.h"
//#include "sys.h"
//#include "lcd.h"
//#include "usart.h"
//#include "usmart.h"
//#include "rtc.h"
///************************************************
// ALIENTEK 战舰STM32F103开发板实验15
// RTC实时时钟实验
// 技术支持:www.openedv.com
// 淘宝店铺:http://eboard.taobao.com
// 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
// 广州市星翼电子科技有限公司
// 作者:正点原子 @ALIENTEK
//************************************************/
// int main(void)
// {
// u8 t=0;
// delay_init(); //延时函数初始化
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
// uart_init(115200); //串口初始化为115200
// LED_Init(); //LED端口初始化
// LCD_Init();
// usmart_dev.init(SystemCoreClock/1000000); //初始化USMART
// RTC_Init(); //RTC初始化
// POINT_COLOR=RED;//设置字体为红色
// LCD_ShowString(60,50,200,16,16,"WarShip STM32");
// LCD_ShowString(60,70,200,16,16,"RTC TEST");
// LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
// LCD_ShowString(60,110,200,16,16,"2018/5/25");
// //显示时间
// POINT_COLOR=BLUE;//设置字体为蓝色
// LCD_ShowString(60,130,200,16,16," - - ");
// LCD_ShowString(60,162,200,16,16," : : ");
// while(1)
// {
// if(t!=calendar.sec)
// {
// t=calendar.sec;
// LCD_ShowNum(60,130,calendar.w_year,4,16);
// LCD_ShowNum(100,130,calendar.w_month,2,16);
// LCD_ShowNum(124,130,calendar.w_date,2,16);
// switch(calendar.week)
// {
// case 0:
// LCD_ShowString(60,148,200,16,16,"Sunday ");
// break;
// case 1:
// LCD_ShowString(60,148,200,16,16,"Monday ");
// break;
// case 2:
// LCD_ShowString(60,148,200,16,16,"Tuesday ");
// break;
// case 3:
// LCD_ShowString(60,148,200,16,16,"Wednesday");
// break;
// case 4:
// LCD_ShowString(60,148,200,16,16,"Thursday ");
// break;
// case 5:
// LCD_ShowString(60,148,200,16,16,"Friday ");
// break;
// case 6:
// LCD_ShowString(60,148,200,16,16,"Saturday ");
// break;
// }
// LCD_ShowNum(60,162,calendar.hour,2,16);
// LCD_ShowNum(85,162,calendar.min,2,16);
// LCD_ShowNum(108,162,calendar.sec,2,16);
// LED0=!LED0;
// }
// delay_ms(10);
// };
// }
USART3_Sned_Char('+');
sprintf(usar_buff,"%d",shuju5); // 烟雾 3
USART3_Sned_Char_Buff2(usar_buff);//
#include "timer.h"
#include "usart.h"
//V1.1 20120904
//1,增加TIM3_PWM_Init函数。
//2,增加LED0_PWM_VAL宏定义,控制TIM3_CH2脉宽
//////////////////////////////////////////////////////////////////////////////////
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
//LED1=!LED1;
}
}
//TIM3 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5
//设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5 右
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2 通道2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
// GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
//设置该引脚为复用输出功能,输出TIM3 CH3的PWM脉冲波形 GPIOB.0 左
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM_CH3 通道3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM3 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
//初始化TIM3 Channel3 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC3
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE); //使能TIM3
}
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//定时器 驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/4
//版本:V1.1
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//********************************************************************************
void TIM3_Int_Init(u16 arr,u16 psc);
void TIM3_PWM_Init(u16 arr,u16 psc);
#endif
//TIM_OC2Init TIM_OC3Init
//TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_SetCompare3(TIM3,899-pwm1); //左
TIM_SetCompare2(TIM3,899-pwm2); //右
标签:DMA,16,STM32,TIM,ADC,GPIO,USART3,Char 来源: https://blog.csdn.net/qq_36958104/article/details/95656522