PIC单片机高阶实战(一):PIC32MX振荡器与定时器

作为一名使用PIC单片机近三十年的工程师,我最早从PIC16F87X系列起步,逐步深入至更集成、功能更丰富的型号。在智慧农业、工业控制等实际项目中,PIC32MX 是我频繁使用的核心芯片。其丰富的外设与六串口设计,非常适合构建多通道通信与控制系统。本次我将以一款实际投产数年的核心控制板为例,控制板MCU型号为PIC32MX534F064H,先从振荡器和定时器开始简单讲解。

该控制板集成了以下6大功能:

1、2路RS485数据收发(可接LED屏、各种传感器、或与其他控制板通信);

2、1路UART-TTL(可接摄像头等);

3、1路4G模块数据收发(移远或中移4G模块);

4、1路LORA无线数据收发或RS485数据收发;

5、2路无源开关量输入;

6、太阳能供电(带充电管理)或直流电源直接供电;

一、 PIC 时钟 配置

相比8位机、16位机,PIC32 MX系列的时钟复杂了许多,也灵活了许多。

复制代码
时钟配置流程:外部晶振/内部RC → 分频/倍频(PLL) → 系统时钟(SYSCLK) → 外设时钟(PBCLK)

关键参数:

  • POSCMOD :主振荡器模式(HS:高速晶振,XT:标准晶振,EC:外部时钟)
  • FNOSC :最终系统时钟源选择(如PRIPLL:主振荡器+PLL)
  • FPLLMUL/FPLLIDIV/FPLLODIV :PLL的倍频/分频系数,决定最终主频
  • FPBDIV :外设时钟分频,决定外设总线速度

以下是我在这款控制板上使用的时钟配置:

#include<p32mx534f064h.h>

复制代码
#pragma config FPLLMUL = MUL_20    // PLL倍频:20倍
复制代码
#pragma config FPLLIDIV = DIV_2    // PLL输入分频:2分频
复制代码
#pragma config FPLLODIV = DIV_1    // PLL输出分频:1分频
复制代码
#pragma config FWDTEN = OFF        // 看门狗禁用(调试阶段)
复制代码
#pragma config POSCMOD = HS        // 主振荡器模式:高速晶振
复制代码
#pragma config FNOSC = PRIPLL      // 系统时钟源:主振荡器+PLL
复制代码
#pragma config FPBDIV = DIV_1      // 外设时钟分频:1分频
复制代码
复制代码
#define SYS_FREQ (80000000L)       // 系统主频 80MHz

void main()

{

SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);

//其他初始化

While(1)

{

//主循环

}

}

这套配置如何得到80MHz主频?让我们一步步拆解:

  1. 输入源 :外部8MHz晶振(HS模式)
  2. FPLLIDIV = DIV_2 :8MHz ÷ 2 = 4MHz
  3. FPLLMUL = MUL_20 :4MHz × 20 = 80MHz
  4. FPLLODIV = DIV_1 :80MHz ÷ 1 = 80MHz
  5. FPBDIV = DIV_1 :外设总线也是80MHz(与系统同频)

另:如果要配置比如75M主频,则步骤及外部晶振可选择如下:

  1. 输入源 :外部10MHz晶振(HS模式)
  2. FPLLIDIV = DIV_2 :10MHz ÷ 2 = 5MHz
  3. FPLLMUL = MUL_15 :5MHz × 15 = 75MHz
  4. FPLLODIV = DIV_1 :75MHz ÷ 1 =75MHz
  5. FPBDIV = DIV_1 :外设总线也是75MHz(与系统同频)
复制代码
#define SYS_FREQ (75000000L)       // 系统主频 75MHz

其他主频都可以通过外部晶振及倍频、分频来实现

二、 Timer1:定时器应用

PIC32 系列器件采用了一个同步 / 异步 16 位定时器,它可作为自由运行的时段定时器使用,用于各种计时应用并计数外部事件。具体配置及程序如下:

#include<p32mx534f064h.h>

复制代码
#pragma config FPLLMUL=MUL_20,FPLLIDIV=DIV_2,FPLLODIV=DIV_1,FWDTEN=OFF
复制代码
#pragma config POSCMOD=HS,FNOSC=PRIPLL,FPBDIV=DIV_1
复制代码
复制代码
#define SYS_FREQ                          (80000000L)
复制代码
void main() {
复制代码
SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
复制代码
ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_3 | T1_INT_SUB_PRIOR_1);
复制代码
//其他初始化
复制代码
INTEnableInterrupts();
复制代码
                           OpenTimer1(T1_ON | T1_PS_1_1 | T1_SOURCE_INT,4000); //分频设置为1
复制代码
复制代码
    while(1) {
复制代码
        // 主循环,可加入其他任务
复制代码
    }
复制代码
}
复制代码
void __ISR(_TIMER_1_VECTOR, ipl3) _Timer1Handler(void) //Timer1中断子程序
复制代码
复制代码
{
复制代码
复制代码
 //      DisableIntT1;
复制代码
复制代码
       
复制代码
                               
复制代码
复制代码
复制代码
//       EnableIntT1;
复制代码
复制代码
}
三、本系列文章规划

本文是《PIC单片机高阶实战》系列的第一篇,后续将逐步展开以下内容:

|----|-------------------|-----------------|
| 序号 | 主题 | 内容概要 |
| 1 | 振荡器与定时器 | 时钟配置与定时中断 |
| 2 | UART 通信 | 串口配置、波特率转换、数据透传 |
| 3 | I/O 按键输入 | 电平变化中断 |
| 4 | 4G 模块数据收发 | AT指令控制、4G模块数据透传 |
| 5 | 数据存储 | 数据存储与读取 |

PIC 单片机入门实战》共 8 篇文章与《 PIC 单片机进阶实战》共 6 篇文章与《 PIC 单片机高阶实战》 5 篇内容来源于我自己画的电路原理图及程序,有对 PIC 单片机感兴趣想学习的朋友可以关注我,免费赠送资料(包括原理图、数据手册、各种例程等)。

有需要这款开发板的朋友也可以关注联系我。

后续干货不断,咱们一起在单片机的世界里,共同进步。

相关推荐
炸膛坦客8 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
MetrixAeroCore11 小时前
自动售货机库存上报异常物联网卡DNS解析失败修复教程
物联网
ANSIOT11 小时前
安朔科技蓝牙无感开锁方案,靠近自动解锁
网络·科技·物联网
微硬创新11 小时前
耐达讯自动化 CC-Link IE 转 PROFINET网关在污水厂智能化升级实战
人工智能·物联网·网络协议·自动化·信息与通信
华清远见IT开放实验室13 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
AI的探索之旅15 小时前
AI辅助原理图评审:电源去耦、BOOT引脚、VCAP——19项逐一核查,遗漏?不存在的
人工智能·vscode·嵌入式硬件
茯苓gao15 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
GeekArch15 小时前
第24讲:Vibe模式代码风格控制——适配Keil/STM32工程规范
人工智能·stm32·单片机·嵌入式硬件·mcu·决策树·ai编程
YCOSA202515 小时前
雨晨 Windows 11 IOT 企业版 LTSC 24H2 轻装 2合1 26100.8968
windows·物联网
乐鑫科技 Espressif16 小时前
用 AI 开发 Zephyr-IoT 应用
人工智能·物联网·esp32·乐鑫科技·zephyr