pic32mx是什么cpu_PIC32MX单片机外设库使用(Ⅰ)- 系统时钟及I/O口基本设置
发布日期:2021-06-24 15:00:01 浏览次数:3 分类:技术文章

本文共 3801 字,大约阅读时间需要 12 分钟。

步骤二:设置I/O口的值

/**************************************************************************

**功能:设置PORTG的第16根口线值为0。

**输入1:IOPORT_G -- 对应PORTG口

**输入2:BIT_15 -- 对应选定PORTG口的第16位

**说明:调用该函数会自动关闭掉带模拟功能I/O口的模拟功能。

***************************************************************************/

PORTClearBits(IOPORT_G, BIT_15);

同理,若是想设置PORTG口的第16位为输出"1",可以使用函数为:

PORTSetBits(IOPORT_G, BIT_15);

同理,若只是想翻转原来的I/O口值,也可以直接使用库函数

PORTToggleBits(IOPORT_G, BIT_15);

4.2 振荡器控制

PIX32X系列单片机有多个时钟源,基本可以分为内部时钟源及外部时钟源两大类,振荡器库函数提 供了单片机时钟源的各种配置功能。

/**************************************************************************

**函数原型void OSCConfig(unsigned long int config1,

unsigned long int config2,

unsigned long int config3,

unsigned long int config4);

**功能:该函数用于设置振荡源、PLL分频器、PLL倍频器、和FRC除数因子

**输入1:config1 -- 包含时钟源选择的位段(即选择一下宏定义就能选择对应的时钟源)

OSC_FRC_DIV

OSC_FRC_DIV16

OSC_LPRC

OSC_SOSC

OSC_POSC_PLL

OSC_POSC

OSC_FRC_PLL

OSC_FRC  —— 内部8M振荡器

**输入2:config2 -- PLL倍频器位段选择

OSC_PLL_MULT_15

OSC_PLL_MULT_16

OSC_PLL_MULT_17

OSC_PLL_MULT_18

OSC_PLL_MULT_19

OSC_PLL_MULT_20

OSC_PLL_MULT_21

OSC_PLL_MULT_24

**输入3:config3 -- PLL分频位段选择

OSC_PLL_POST_1

OSC_PLL_POST_2

OSC_PLL_POST_4

OSC_PLL_POST_8

OSC_PLL_POST_16

OSC_PLL_POST_32

OSC_PLL_POST_64

OSC_PLL_POST_256

**输入4:config4 -- FRC除法因子选择

OSC_FRC_DIV_1

OSC_FRC_DIV_2

OSC_FRC_DIV_4

OSC_FRC_DIV_8

OSC_FRC_DIV_16

OSC_FRC_DIV_32

OSC_FRC_DIV_64

OSC_FRC_DIV_256

**说明:调用该函数会自动关闭掉带模拟功能I/O口的模拟功能。

***************************************************************************/

实际代码分析

main() {

// this example sets the cpu clock to FRC and then to POSC PLL

OSCConfig(OSC_FRC, 0, 0, 0); //选择内部FRC 8M 晶振 mOSCSetPBDIV(OSC_PB_DIV_8); //外设时钟分频器选择

}

说明:关于输入参数的具体含义需要找到相关的宏定义及对芯片的时钟源架构有很好的了解,此处笔者选用内部FRC 8M晶振。

4.3定时器控制

目标:制作500ms定时器,用于LED的闪烁控制

/**************************************************************************

**函数原型void OpenTimer1(unsigned int config, unsigned int period),

**功能:定时器1配置

**输入1:config1 -- 定时器1配置位段

Timer Module On/Off(定时器1模块开启 或 关闭)

Tx_ON

Tx_OFF

Asynchronous Timer Write Disable (同步定时器写使能)

T1_TMWDIS_ON

T1_TMWDIS_OFF

Timer Module Idle mode On/Off (定时器空闲模式开启 或 关闭)

Tx_IDLE_CON

Tx_IDLE_STOP

Timer Gate time accumulation enable

Tx_GATE_ON

Tx_GATE_OFF

Timer Prescaler (1)  -- --Timer Input Clock Prescale Select bits,timer1只有这个选项

T1_PS_1_1

T1_PS_1_8

T1_PS_1_64

T1_PS_1_256

Timer Prescaler

Tx_PS_1_1

Tx_PS_1_2

Tx_PS_1_4

Tx_PS_1_8

Tx_PS_1_16

Tx_PS_1_32

Tx_PS_1_64

Tx_PS_1_256

Timer Synchronous clock enable (1)

Tx_SYNC_EXT_ON

Timer Clock source

Tx_SOURCE_EXT  -- External clock from TxCKI pin

T1_SOURCE_INT   -- Internal peripheral clock

输入2:period -- This argument contains the 16-bit period value for the Timer.

**说明:This macro clears the TMRx register, writes periodto the PRx register

and writes configto the TxCON register

***************************************************************************/

实际代码分析:

void TIMER_Config()

{

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// STEP 1. configure the Timer1

OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_256, 0x7A1); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// STEP 2. set the timer interrupt to prioirty level 2

ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_2); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// STEP 3. enable multi-vector interrupts

INTEnableSystemMultiVectoredInt();

}

Timer 定时器工作原理浅析:

经过上面设置,定时器从0开始计数,当计数值与period(此代码为0x100) 时产生中断,中断后会清标志,并清period值,重新从0开始计数(period对应寄存器PR1)

void __ISR(4, ipl2) _Timer1Handler(void)

{

// clear the interrupt flag

mT1ClearIntFlag();

// .. things to do ..

OPEN_LED_D4();

}

下面我们可以一起验证下时钟配置是否正确:

目标:产生500ms的定时器。

1.系统时钟选择为FRC = 8M

2.系统外设时钟为系统时钟的8分频 = 8M/8 = 1M

3.定时器时钟源选择为内部系统外设时钟,且做了256次分频 1M/256 = 3906

4.500ms转换成频率就是2(HZ)

那么PR1的值应该是多少呢? 3906/2 = 1953 转换成16进制就是7A1,这样一来就得出了配置时钟1时period应该写入的值了。

用示波器观察LED_D4指示灯的高低电平时间为504ms,考虑到一定的误差,总体设计应该是对的。

转载地址:https://blog.csdn.net/weixin_33520510/article/details/111910332 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:vue后台如何刷新过期的token_vue判断token是否过期,过期后刷新token
下一篇:html中php if else,HTML/PHP if-else语句

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年03月31日 13时40分31秒