本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!