本帖最后由 pzsh 于 2021-10-9 13:33 编辑
硬件平台:PIC24JF128GB106、PICkit 4调试器
软件平台:MPLAB X IDE V5.5
芯片手册:https://www.microchip.com/content/dam/mchp/documents/OTH/ProductDocuments/DataSheets/39897c.pdf
测试工程:
Touch_Demo.X.zip
(82.72 KB)
起因
最近找到一块开发板——CAP TOUCH-CTMU EVAL BOARD,但是在Microchip确没有找到它的原理图等硬件资料。所以一时无法将其使用起来。
后面仔细查看此开发板后,发现它本身外设不多比较简单。所以就想使用万用表将LED灯引脚、Program排针以及mTouch Metal Over Cap板接口所接的芯片引脚找出来。
尝试解决
硬件接线确认
1. 先确认16个LED灯接线,观察Touch开发板发现LED接线很规整都是从芯片上端、左边引脚引脚通过1K电阻直接到了16个LED上。这个16个LED是共地的,也就是将芯片接LED的引脚置高平时LED亮,设置低电平时LED灭。
2.使用数字万用表的“二极管”测量档位(红黑表笔短路蜂鸣器会响),然后验证第一步的确认的结果,实际经测量发现确认如观察一样。
3. 查看PIC24FJ128GB106芯片手册,先确认芯片的第一个引脚位置。通过查看芯片封闭上的小黑点(引脚1的位置)
4. 通过查看芯片手册引脚图和实际用万用表测量的接线相结合,最终确认每个LED灯与芯片引脚所对应的接线并将接线记录在Excel表中
5. 按照同样的方法,确认Program排针、Touch面板与芯片引脚的接线。整理如下图:
完整的对应表:
开发板接线图.zip
(9.13 KB)
新建工程
打开MPLAB X IDE,新建工程。具体步骤就不再赘述了,如想了解工程如何创建可以查看我前面写的**。
注:如果在编译器选择窗口中出现“红色”警告字体,表示您没有安装相关编译器。PIC24芯片使用的是16位的编译器
xc 16编译器下载:https://ww1.microchip.com/downloads/en/DeviceDoc/xc16-v1.70-full-install-windows64-installer.exe
编写代码
新建的工程只是一堆文件夹,里面什么文件都没有。所以我们第一步就是创建源文件main.c,在工程目录中选中source file文件夹点击鼠标右键 >> New >> C Source File...
在main.c文件中添加main函数,然后直接编译。接上调试器尝试直接下载,以检测开发是否可以正常下载程序。
疑问:
为什么不先调试?
答:因为芯片调试需要具体一定调试条件才能进行调试,比如设置调试相关的寄存器和引脚等。
查看芯片手册
1. 查看芯片复位相关信息
先查看芯片复位后所做的操作,因为我们的工程完全是一个空的。芯片上电后引脚状态以及其他情况完全由芯片复位所做的操作决定的。
查看芯片手册第6章,从图中可以看出来,芯片复位的时钟源由配置字2中的FNOSC位决定
2. 查看配置字
查看手册第26章的特性章节可以找到关于配置字的说明与配置。比如:我们需要选择复位的时钟源,此时就可以通过设置配置字2的bit 10-8 FNOSC<2:0>来设置时钟源。
3. 阅读IO章节
查看手册的第10章节,可以了解IO的操作。TRISx寄存器设置IO输入/出模式。
4. 查看时钟源
查看手册第8章,从时钟框图中我们可以了解要使CPU工作需要如何设置时钟源。这里我们使用内部高速时钟(FRC),它的时钟频率为8MHZ
5. 编写LED控制代码
查看芯片寄存器map图
查看手册第4章的寄存器Map图,可以得到每个寄存器的地址值,从而通过指针的形式来操作寄存器。
相关代码:
typedef struct TRISx{
uint8_t TRISx_0: 1;
uint8_t TRISx_1: 1;
uint8_t TRISx_2: 1;
uint8_t TRISx_3: 1;
uint8_t TRISx_4: 1;
uint8_t TRISx_5: 1;
uint8_t TRISx_6: 1;
uint8_t TRISx_7: 1;
uint8_t TRISx_8: 1;
uint8_t TRISx_9: 1;
uint8_t TRISx_10: 1;
uint8_t TRISx_11: 1;
uint8_t TRISx_12: 1;
uint8_t TRISx_13: 1;
uint8_t TRISx_14: 1;
uint8_t TRISx_15: 1;
}TRISx_TypeDef;
typedef struct PORTx{
uint8_t PORTx_0: 1;
uint8_t PORTx_1: 1;
uint8_t PORTx_2: 1;
uint8_t PORTx_3: 1;
uint8_t PORTx_4: 1;
uint8_t PORTx_5: 1;
uint8_t PORTx_6: 1;
uint8_t PORTx_7: 1;
uint8_t PORTx_8: 1;
uint8_t PORTx_9: 1;
uint8_t PORTx_10: 1;
uint8_t PORTx_11: 1;
uint8_t PORTx_12: 1;
uint8_t PORTx_13: 1;
uint8_t PORTx_14: 1;
uint8_t PORTx_15: 1;
}PORTx_TypeDef;
typedef struct LATAx{
uint8_t LATAx_0: 1;
uint8_t LATAx_1: 1;
uint8_t LATAx_2: 1;
uint8_t LATAx_3: 1;
uint8_t LATAx_4: 1;
uint8_t LATAx_5: 1;
uint8_t LATAx_6: 1;
uint8_t LATAx_7: 1;
uint8_t LATAx_8: 1;
uint8_t LATAx_9: 1;
uint8_t LATAx_10: 1;
uint8_t LATAx_11: 1;
uint8_t LATAx_12: 1;
uint8_t LATAx_13: 1;
uint8_t LATAx_14: 1;
uint8_t LATAx_15: 1;
}LATAx_TypeDef;
#define TRISD (*((TRISx_TypeDef *)0x02D8))
#define LATAD (*((LATAx_TypeDef *)0x02D8))
#define PORTD (*((PORTx_TypeDef *)0x02DA))
#define OSCCON (*(uint16_t *)(0x0742))
int main(void)
{
OSCCON &= (~(0x03 << 12));
OSCCON &= (~(0x03 << 8));
TRISD.TRISx_0 = 0;
PORTD.PORTx_0 = 0;
PORTD.PORTx_0 = 1;
// LATAD.LATAx_0 = 1;
while(1)
{
;
}
return 0;
}
6. 调试代码
先使用软件调试,同时调出IO View查看相关寄存器是否设置成功
注:IO View在Window >> Debugging >> IO View
7. 问题确认与修复
通过上述软件仿真,我们大概可以确认代码没有什么大的错误。只要时钟设置OK,运行就不会有问题。因为软件仿真无法仿真实际的时钟。
设置工程
在工程设置窗口中选择硬件调试器——PICkit 4,点击调试按钮后发现工程无法进入调试模式且在Output窗口中会有以下错误信息输出:
The target device is not ready for debugging. Please check your configuration bit settings and program the device before proceeding. The most common causes for this failure are oscillator and/or PGC/PGD settings.
检查PICkit 4是否支持此芯片
查看PICkit 4的Release Note或者Readme确认其是否支持PIC24FJ128GB106芯片
说明:PICkit 4的Release Note在MPLAB X IDE安装目录下的docs目录中
更换其他确认正常的调试器再调试此芯片
在更换ICD 4调试器后,再次点击调试。发现还是无法使工程进入调试状态,同样在Output窗口中输入同样的话。所以觉得应该不是调试器的问题,而是芯片设置问题。后面仔细查看Output输出的红色提示信息:芯片时钟或者调试引脚设置不对(PGC/PGD)
确认调试引脚及接口信息
1. 先确认时钟,点击Window >> PIC Memory View >> Configurate bits打开MPLAB X IDE给我们提供的芯片配置字设置窗口。
通过前面Program排针接线,可以知道Program接口调试引脚接的是PGEC2、PGED2
配置字设置
- 禁用WatchDoc和JTAG接口
- 选择内部高速时钟(FRC)
- 配置ICSP接口引脚为PGEC2、PGED2
按照下图所示设置好,并点击”Output Source code“按钮,在Output窗口中生成配置字操作的源代码。然后将源代码复制并粘贴到main函数前面。这样调试器在下载调试程序前会自动将芯片的配置字设置一并烧写到相应的Flash地址处。这样就设置我们刚才配置好的配置字
重新编译再调试
可以调试了!!!,Output窗口中也没有红色的错误信息了。
试着点击单步调试按钮,发现程序也能按照要求一步一步运行了!
当程序执行完PORTD.PORTx_0 = 1;语句时,开发板上的LED灯D1也亮了!
|