本帖最后由 lising 于 2018-10-31 18:18 编辑
本次实验利用MM32F103C8T6的ADC外设采集芯片内部温度,并通过串口发送至PC端利用串口调试助手进行显示。
一、实验资源
1、MM32F103开发板;
2、KEIL 5.25.2;
3、J-LINK V9;
4、串口助手 SSCOM V5.13.1;
5、新驱动力提供的开发例程;
二、实验过程
1、先调试UART。根据电路图可以了解到,系统采用CH340T芯片进行USB-TTL转换,并且与MCU的PA9、PA10即UART1相连;
2、安装CH340驱动后可以在“设备管理器”看到此设备端口号为“COM5”;
3、串口发送程序。实验程序相对比较简单只是发送,在串口初始化程序中主要对UART1进行相应设置,比如:波特率为115200、8位数据位、1位停止、无校验。PA9为UART1_TX,将其配置复用推挽输出。最后还要打开GPIOA及UART1时钟。初始化代码:
- void uart_initwBaudRate(u32 bound)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- UART_InitTypeDef UART_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1|RCC_APB2Periph_GPIOA, ENABLE); //使能UART1,GPIOA时钟
- UART_InitStructure.UART_BaudRate = bound; //串口波特率
- UART_InitStructure.UART_WordLength = UART_WordLength_8b;//字长为8位数据格式
- UART_InitStructure.UART_StopBits = UART_StopBits_1; //一个停止位
- UART_InitStructure.UART_Parity = UART_Parity_No; //无奇偶校验位
- UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;//无硬件数据流控制
- UART_InitStructure.UART_Mode = UART_Mode_Tx; //发送模式
-
- UART_Init(UART1, &UART_InitStructure); //初始化串口1
- UART_Cmd(UART1, ENABLE); //使能串口1
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //UART1_TX GPIOA.9
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.9
- }
复制代码
4、另外还要添加串口打印重定向函数,这个函数官方例程中已经写好了。
- int fputc(int ch, FILE *f)
- {
- while((UART1->CSR&UART_IT_TXIEN)==0);//循环发送,直到发送完毕
- UART1->TDR = (ch & (uint16_t)0x00FF);
- return ch;
- }
复制代码
5、串口程序测试。在主函数中对串口初始化程序进行调用,并将形参参数设置为“115200”即UART1波特率。将采集的温度数据以1.5s时间间隔利用“printf()”向串口打印;经串口高度助手软件在PC端进行显示:
- int main(void)
- {
- uart_initwBaudRate(115200); //串口初始化为115200
-
- printf("\r\n 新驱动力MM32F103C8T6\r");
- printf("\r\n UART1 TEST OK!\r\n");
-
- while(1)
- {
- }
- }
复制代码
6、ADC采集芯片内部温度传感器。MM32F103C8T6内部有两个ADC,分别为ADC1和ADC2。片内温度传感被连到了ADC1的通道8,如图:
7、对ADC1通道8进行相关设置。初始化函数中开启并使能ADC1通道8,采用单次采集模式。对于通道8采集温度传感器要对A/D配置寄存器(ADC_ADCFG)的“TVSEN”设置。包括ADC1通道8的数据采集函数例程中已有详细交待,这里就不贴了。
8、在主程序中,按照官方例程对采集的数据进行温度转换,不过这个公式与其它芯片所用的处理公式有区别,暂时还没有分析;
- int main(void)
- {
- delay_init(); //延时函数初始化
- uart_initwBaudRate(115200); //串口初始化为115200
- ADC1_SingleChannel(ADC_Channel_8); //配置ADC1为单次转换模式,通道8使能
- while(1)
- {
- if(ADC1_SingleChannel_Get(ADC_Channel_8, &GetTemp))
- {
- Temperate = (float)GetTemp*(3.32/4095); //电压值
- Temperate = (Temperate-1.5) / 0.00478 + 25; //转换为温度值
- printf("\r\n当前测得芯片内部温度为:%.2f℃\r\n",Temperate);
- delay_ms(1500);
- }
- }
- }
复制代码
三、实验结果。开发板上的“UART”端口通过数据线与PC端的USB口连接,经串口调试助手软件在PC端进行显示:
四、总结。利用官方提供的例程进行实验测试比较简单,但是官方提供的用户手册有些简单,并且还有一些错误。例如,在对手册ADC章节学习中发现P125的“11.6 外部触发转换 ”对“ADCFG寄存器的TRGEN位”描述有误,“TRGEN”位在控制寄存器(ADC_ADCR)的bit2。
另外,还有一处在数据手册P14的“2.2.23 温度传感器 ”中将连接在ADC1_IN8的温度传感器描述为“温度传感器在内部被连接到 ADC1_IN9的输入通道上”:
同时也借此机会建议官方能将用户手册更加深入扩展,加入对库函数的说明。