社区导航

 

搜索
查看: 1269|回复: 1

[原创] 新驱动力MM32F103测试(三)UART+ADC

[复制链接]

829

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2018-10-31 18:16 | 显示全部楼层 |阅读模式
本帖最后由 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相连;
QQ截图20181031161009.png

2、安装CH340驱动后可以在“设备管理器”看到此设备端口号为“COM5”;
QQ截图20181031161502.png

3、串口发送程序。实验程序相对比较简单只是发送,在串口初始化程序中主要对UART1进行相应设置,比如:波特率为115200、8位数据位、1位停止、无校验。PA9为UART1_TX,将其配置复用推挽输出。最后还要打开GPIOA及UART1时钟。初始化代码:
  1. void uart_initwBaudRate(u32 bound)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         UART_InitTypeDef UART_InitStructure;
  5.         
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1|RCC_APB2Periph_GPIOA, ENABLE);        //使能UART1,GPIOA时钟

  7.         UART_InitStructure.UART_BaudRate = bound;                                                                //串口波特率
  8.         UART_InitStructure.UART_WordLength = UART_WordLength_8b;//字长为8位数据格式
  9.         UART_InitStructure.UART_StopBits = UART_StopBits_1;                        //一个停止位
  10.         UART_InitStructure.UART_Parity = UART_Parity_No;                                //无奇偶校验位
  11.         UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;//无硬件数据流控制
  12.         UART_InitStructure.UART_Mode = UART_Mode_Tx;        //发送模式
  13.         
  14.         UART_Init(UART1, &UART_InitStructure);                                                                 //初始化串口1
  15.         UART_Cmd(UART1, ENABLE);                                                            //使能串口1
  16.         
  17.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                                 //UART1_TX   GPIOA.9
  18.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                //复用推挽输出
  20.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                                                //初始化GPIOA.9     
  21. }
复制代码



4、另外还要添加串口打印重定向函数,这个函数官方例程中已经写好了。
  1. int fputc(int ch, FILE *f)
  2. {      
  3.         while((UART1->CSR&UART_IT_TXIEN)==0);//循环发送,直到发送完毕   
  4.         UART1->TDR = (ch & (uint16_t)0x00FF);      
  5.         return ch;
  6. }
复制代码



5、串口程序测试。在主函数中对串口初始化程序进行调用,并将形参参数设置为“115200”即UART1波特率。将采集的温度数据以1.5s时间间隔利用“printf()”向串口打印;经串口高度助手软件在PC端进行显示:
  1. int main(void)
  2. {            
  3.         uart_initwBaudRate(115200);                         //串口初始化为115200
  4.         
  5.         printf("\r\n  新驱动力MM32F103C8T6\r");
  6.         printf("\r\n     UART1 TEST OK!\r\n");
  7.         
  8.         while(1)
  9.         {         
  10.         }   
  11. }
复制代码

QQ截图20181031171241.png

6、ADC采集芯片内部温度传感器。MM32F103C8T6内部有两个ADC,分别为ADC1和ADC2。片内温度传感被连到了ADC1的通道8,如图:
QQ截图20181031165426.png

7、对ADC1通道8进行相关设置。初始化函数中开启并使能ADC1通道8,采用单次采集模式。对于通道8采集温度传感器要对A/D配置寄存器(ADC_ADCFG)的“TVSEN”设置。包括ADC1通道8的数据采集函数例程中已有详细交待,这里就不贴了。
QQ截图20181031172339.png
QQ截图20181031172359.png

8、在主程序中,按照官方例程对采集的数据进行温度转换,不过这个公式与其它芯片所用的处理公式有区别,暂时还没有分析;
  1. int main(void)
  2. {            
  3.         delay_init();                                                                                                                                     //延时函数初始化        
  4.         uart_initwBaudRate(115200);                                                                                         //串口初始化为115200      
  5.         ADC1_SingleChannel(ADC_Channel_8);                                                         //配置ADC1为单次转换模式,通道8使能

  6.         while(1)
  7.         {
  8.                 if(ADC1_SingleChannel_Get(ADC_Channel_8, &GetTemp))
  9.                 {                          
  10.                         Temperate = (float)GetTemp*(3.32/4095);                                //电压值
  11.                         Temperate = (Temperate-1.5) / 0.00478 + 25;                //转换为温度值         
  12.                         printf("\r\n当前测得芯片内部温度为:%.2f℃\r\n",Temperate);
  13.                         delay_ms(1500);
  14.                 }
  15.         }   
  16. }
复制代码



三、实验结果。开发板上的“UART”端口通过数据线与PC端的USB口连接,经串口调试助手软件在PC端进行显示:
QQ截图20181031174035.png

四、总结。利用官方提供的例程进行实验测试比较简单,但是官方提供的用户手册有些简单,并且还有一些错误。例如,在对手册ADC章节学习中发现P125的“11.6  外部触发转换 ”对“ADCFG寄存器的TRGEN位”描述有误,“TRGEN”位在控制寄存器(ADC_ADCR)的bit2。
QQ截图20181031174457.png
QQ截图20181031174835.png
另外,还有一处在数据手册P14的“2.2.23 温度传感器 ”中将连接在ADC1_IN8的温度传感器描述为“温度传感器在内部被连接到 ADC1_IN9的输入通道上”:
QQ截图20181031181311.png

      同时也借此机会建议官方能将用户手册更加深入扩展,加入对库函数的说明。



回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-10-18 14:31 | 显示全部楼层

不错



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

词云| Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-7-13 23:56 , Processed in 0.113467 second(s), 24 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表