结合了实验十七和实验十四。由于没有买LCD的板子,所以通过串口调试来查看电压值。
目录
一、准备工作:头文件
1、首先将实验十四的USMART文件夹复制到实验十七中。
2、在keil uvision中将USMART文件包含进来
3、将usmart的头文件路径添加进来
此时运行是会报错的,类似于下面这种
经过和USMART文件对比,并搜索TIM_Cmd函数可以很快发现,是stmf10x_tim.c的库没有添加进来ADC工程导致的,添加进来就可以了。
二、添加一些代码
需要改动的代码:
main.c
#include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "lcd.h" #include "usart.h" #include "adc.h" #include "usmart.h" /************************************************ ALIENTEK 战舰STM32F103开发板实验17 ADC 实验 技术支持:www.openedv.com 淘宝店铺:http://eboard.taobao.com 关注微信公众平台微信号:"正点原子",免费获取STM32资料。 广州市星翼电子科技有限公司 作者:正点原子 @ALIENTEK ************************************************/ //LED状态设置函数 void led_set(u8 sta) { LED1=sta; } //函数参数调用测试函数 void test_fun(void(*ledset)(u8),u8 sta) { ledset(sta); } void test_fun1(u16(*Get_Adc_Average)(u8,u8),u8 ch,u8 times) { //printf("%u\r\n",Get_Adc_Average(ch,times)); u16 adcx1; float temp1; adcx1=Get_Adc_Average(ch,times); temp1=(float)adcx1*(3.3/4096); printf("%u\r\n",adcx1); printf("%f\r\n",temp1); } void test_fun2(u16(*Get_Adc)(u8),u8 ch) { u16 adcx2; float temp2; adcx2=Get_Adc(ch); temp2=(float)adcx2*(3.3/4096); printf("%u\r\n",adcx2); printf("%f\r\n",temp2); } int main(void) { u16 adcx; float temp; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //LED端口初始化 LCD_Init(); Adc_Init(); //ADC初始化 usmart_dev.init(SystemCoreClock/1000000); POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(60,50,200,16,16,"WarShip STM32"); LCD_ShowString(60,70,200,16,16,"ADC TEST"); LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(60,110,200,16,16,"2015/1/14"); //显示提示信息 POINT_COLOR=BLUE;//设置字体为蓝色 LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:"); LCD_ShowString(60,150,200,16,16,"ADC_CH0_VOL:0.000V"); while(1) { adcx=Get_Adc_Average(ADC_Channel_1,10); LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值 temp=(float)adcx*(3.3/4096); adcx=temp; LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值 temp-=adcx; temp*=1000; LCD_ShowxNum(172,150,temp,3,16,0X80); LED0=!LED0; delay_ms(250); } }
usamrt_config.c
#include "usmart.h" #include "usmart_str.h" 用户配置区/// //这下面要包含所用到的函数所申明的头文件(用户自己添加) #include "delay.h" #include "sys.h" #include "lcd.h" #include "adc.h" extern void led_set(u8 sta); extern void test_fun(void(*ledset)(u8),u8 sta); extern void test_fun1(void(*Get_Adc_Average)(u8,u8),u8 ch,u8 times); extern void test_fun2(void(*Get_Adc)(u8),u8 ch); //函数名列表初始化(用户自己添加) //用户直接在这里输入要执行的函数名及其查找串 struct _m_usmart_nametab usmart_nametab[]= { #if USMART_USE_WRFUNS==1 //如果使能了读写操作 (void*)read_addr,"u32 read_addr(u32 addr)", (void*)write_addr,"void write_addr(u32 addr,u32 val)", #endif (void*)delay_ms,"void delay_ms(u16 nms)", (void*)delay_us,"void delay_us(u32 nus)", (void*)LCD_Clear,"void LCD_Clear(u16 Color)", (void*)LCD_Fill,"void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)", (void*)LCD_DrawLine,"void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)", (void*)LCD_DrawRectangle,"void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)", (void*)LCD_Draw_Circle,"void Draw_Circle(u16 x0,u16 y0,u8 r)", (void*)LCD_ShowNum,"void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)", (void*)LCD_ShowString,"void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)", (void*)led_set,"void led_set(u8 sta)", (void*)test_fun,"void test_fun(void(*ledset)(u8),u8 sta)", (void*)test_fun1,"void test_fun1(void(*Get_Adc_Average)(u8,u8),u8 ch,u8 times)", (void*)test_fun2,"void test_fun2(void(*Get_Adc)(u8),u8 ch)", (void*)LCD_ReadPoint,"u16 LCD_ReadPoint(u16 x,u16 y)", (void*)Get_Adc_Average,"u16 Get_Adc_Average(u8 ch,u8 times)", (void*)Get_Adc,"u16 Get_Adc(u8 ch) " }; ///END/// / //函数控制管理器初始化 //得到各个受控函数的名字 //得到函数总数量 struct _m_usmart_dev usmart_dev= { usmart_nametab, usmart_init, usmart_cmd_rec, usmart_exe, usmart_scan, sizeof(usmart_nametab)/sizeof(struct _m_usmart_nametab),//函数数量 0, //参数数量 0, //函数ID 1, //参数显示类型,0,10进制;1,16进制 0, //参数类型.bitx:,0,数字;1,字符串 0, //每个参数的长度暂存表,需要MAX_PARM个0初始化 0, //函数的参数,需要PARM_LEN个0初始化 };
三、开始调试
用一个杜邦线,一边接到PA1 ,另一边接GND或者3.3V ,可以看到测量还是非常准确的。