基于Microchip Curiosity PIC32MX470的温湿度计+RTOS+GUI:第二步,Harmony

分享到:

uCOS-III跑起来了,但是温湿度计和OLED还没到,打算用这段空窗期把串口调出来,顺便熟悉一下这块板卡的外设。在调试串口这一点上不得不吐槽一下PIC的开发板了,以前接触的大多数原厂出品的CortexM开发板(FRDM系列、SAM4N、LPC系列)基本都是将debug接口和调试串口合成到了一个USB口,有的甚至集成了drag&drop功能,用户就用一根USB线就可以完成所有的调试。但是PIC32MX470这块板子的USB debug口只有debug功能,想用调试串口只能再接一根USB转TTL的线,不方便。

先在板子自带的Information sheet上找到串口的管脚,有UART1和UART2,但是无奈我是个硬件老白,连根带针的杜邦线都没有,只有两头都是孔的,只能用X32接口上的USART2了。
 
1
 
1. 首先还是先打开MHC(MPLAB Harmony Configurator),找到串口对应的driver选项打开并做相应的配置,我的配置如下
 
2
 
但是配置之后串口没有任何输出,在论坛里搜了相关的文章后才发现我这个硬件老白居然连Pin Settings都没有配就想用串口,后来参考了wudianjun2001大侠文章中串口的配置方法
http://microchip.eefocus.com/module/forum/forum.php?mod=viewthread&tid=57147&highlight=pic32%2Buart
 
2. 按Information Sheet中的pin对应关系修改了Pin Configurations如下
 
3
 
然后生成代码,惊喜地发现使能了RTOS后,生成的USART驱动代码中有了mutex的操作。生成的代码主要包含以下几个源文件,我为了自己的调试打印又加了bsp_ser.c这个文件用来输出字符串
 
4
 
学习代码后可知在SYS_Initialize中已经根据用户的配置调用了USART相关的初始化函数
 
5
所以使用时只需要直接调用drv_usart_mapping.c中的其他API就可以了,我添加的bsp_ser.c和bsp_ser.h中的代码如下(后面才知道这一步根本不需要)
 
#include "system/common/sys_common.h"
#include "system_config.h"
#include "system_definitions.h"
#include "bsp_ser.h"
 
static OS_SEM     BSP_SerTxWait;
static DRV_HANDLE BSP_SerHandle;
 
void  BSP_Ser_Tx_Callback (const SYS_MODULE_INDEX index);
 
void  BSP_Ser_Init (CPU_INT32U  baud_rate)
{
    OS_ERR  err;
 
    OSSemCreate(&BSP_SerTxWait, "Serial Tx Wait", 0, &err);
    BSP_SerHandle = DRV_USART_Open(DRV_USART_INDEX_0, 0);
    DRV_USART_ByteTransmitCallbackSet(BSP_SerHandle, BSP_Ser_Tx_Callback);
 
    DRV_USART_BaudSet(BSP_SerHandle, baud_rate);
}
 
void  BSP_Ser_Tx_Callback (const SYS_MODULE_INDEX index)
{
    OS_ERR  err;
    OSSemPost(&BSP_SerTxWait, OS_OPT_POST_1, &err);                 /* Post to the semaphore                              */
}
 
int  BSP_Ser_WrByte (int ch)
{
    OS_ERR      err;
 
    DRV_USART_WriteByte(BSP_SerHandle, (CPU_INT08U)ch);
    OSSemPend(&BSP_SerTxWait, 0, OS_OPT_PEND_BLOCKING, 0, &err);
 
    return ch;
}
 
void  BSP_Ser_WrStr (CPU_CHAR  *p_str)
{
    OS_ERR      err;
 
    if (p_str == (CPU_CHAR *)0) {
        return;
    }
 
    while ((*p_str) != (CPU_CHAR )0) {
        if (*p_str == ASCII_CHAR_LINE_FEED) {
            BSP_Ser_WrByte(ASCII_CHAR_CARRIAGE_RETURN);
            BSP_Ser_WrByte(ASCII_CHAR_LINE_FEED);
            p_str++;
        } else {
            BSP_Ser_WrByte(*p_str++);
        }
    }
 
}
 
3. 在_SYS_Tasks任务中添加需要串口打印字符的代码
 
6
 
 
后来又看了些文章,并做了实验才发现,其实只需要在MHC中配置好串口生产代码后就可以使用printf了,根本不需要用户自己添加其他的驱动代码
 
7
 
 
串口和板子按如下方式连接,串口打印正常输出
 
161439tonn257xjz07p0o0
 
161454wg9w60p3pnl3tnlm
 
最后扯一点题外话,也是上篇文章最后留的一个梗。使能uCOS之后我就隐约地感觉到,用MHC配置工程,几乎所有的代码只需要在正确配置后点一下Generate Code按钮就出来了,留给用户做的就是按自己的需求写app的代码了。这种移植的活儿在以前都是要消耗数人天甚至数人周的工作,而现在一个新手也可以简单地改改配置就将RTOS移植过来(假如MHC做得更好);这让我不由地感觉到了底层软件工程师的职业生涯危机。尤其在添加了USART驱动之后,更加觉得驱动的工作就只剩下了在IDE里改配置了,因为到目前为止,芯片手册我只看过memory map,别的章节都没看。。。这样再发展些时日是不是就不需要做驱动和BSP的工程师了?难道这就是人工智能对码农的影响?细思极恐。。。
今天上午OLED和温湿度传感器模块也都到了,下一步就是打开I2C,调试温湿度传感器了。

 

继续阅读
51单片机、AVR单片机和PIC单片机IO口的操作

51单片机、AVR单片机和PIC单片机IO口结构的均不同,导致了IO口操作也不同。操作单片机IO口的目的是让单片机的管脚输出逻辑电平和读取单片机管脚的逻辑电平。下面我们来看看51单片机、AVR单片机和PIC单片机IO口的操作的方法。

Microchip Curiosity PIC32MX470+简单测试 +点亮LED灯

我这次拿到的板子是PIC32MX470 Curiosity开发板,第一次使用,就先来点个LED灯吧。使用定时器中断来实现,亮灭时间各一秒。

用Microchip Curiosity PIC32MX470驱动OLED12864显示屏

这次要测试的是驱动OLED12864显示屏。OLED12864模块使用的是IIC接口,SDA接RF4引脚,SCL接RF5引脚,电源为3.3V。IIC时序使用软件模拟,采用强制读写模式。

Microchip PIC单片机12864汉字液晶模块显示文字

本文是用PIC单片机12864汉字液晶模块来显示文字

项目分享:基于Microchip PIC32MM Curiosity的超级电容器

级电容器的应用非常广泛,电动车起步、加速,给HIFI做电源,点焊机等。这次分享的项目,是超级电容器充电控制。

©2018 Microchip Corporation
facebook google plus twitter linkedin youku weibo rss