一. 端口引脚通用结构图
PORTn->HWSEL 引脚硬件选择寄存器 PORTn->PPS 引脚省电寄存器
PORTn->IOCR 输入输出控制寄存器 PORTn->PHCR 焊盘滞后控制寄存器 PORTn->IN 输入寄存器 PORTn->OMR 输出修改寄存器 PORTn->OUT 输出寄存器
二.寄存器操作
(1)输入模式(前四个直接输入,后四个反相输入)
端口引脚的电压通过焊盘内的施密特触发器被转换逻辑电平0或1,可以选择将该电平反相输入或直接输入,Pn_IN读取。还可以通过ALTIN连接多个片内外设。通过控制PORTn->IOCR来控制输入模式,Pn_IN和ALTIN始终都是代表输入,与引脚配置成输入输出无关。
#define INPUT 0x00U 不激活上/下拉器件 #define INPUT_PD 0x08U 激活下拉
#define INPUT_PU 0x10U 激活上拉(高)
#define INPUT_PPS 0x18U 不激活,Pn_OUT连续采样输入值
#define INPUT_INV 0x20U 不激活上/下拉器件 #define INPUT_INV_PD 0x28U 激活下拉
#define INPUT_INV_PU 0x30U 激活上拉
#define INPUT_INV_PPS 0x38U 不激活,Pn_OUT连续采样输入
例如:
__STATIC_INLINE void P0_0_set_mode(uint8_t mode) {
PORT0->IOCR0 &= ~0x000000f8UL; PORT0->IOCR0 |= mode << 0; }
_STATIC_INLINE void P0_0_set_standard_hysteresis(){ PORT0->PHCR0 &= ~0x00000004UL; }
__STATIC_INLINE void P0_0_set_large_hysteresis(){ PORT0->PHCR0 |= 0x00000004UL; }
(2)输出模式
配置PORTn->IOCR来选择输出模式,通过PORTn->OUT输出结果。如果要修改输出,
应该配置PORTn->OMR,这样不会影响PORTn->OUT的其他位。
#define OUTPUT_PP_GP 0x80U 推挽通用输出 #define OUTPUT_PP_AF1 0x88U 推挽复用1 #define OUTPUT_PP_AF2 0x90U #define OUTPUT_PP_AF3 0x98U #define OUTPUT_PP_AF4 0xA0U #define OUTPUT_PP_AF5 0xA8U #define OUTPUT_PP_AF6 0xB0U
#define OUTPUT_PP_AF7 0xB8U 推挽复用7
#define OUTPUT_OD_GP 0xC0U 开漏通用处处 #define OUTPUT_OD_AF1 0xC8U 开漏复用1 #define OUTPUT_OD_AF2 0xD0U
#define OUTPUT_OD_AF3 0xD8U #define OUTPUT_OD_AF4 0XE0U #define OUTPUT_OD_AF5 0xE8U #define OUTPUT_OD_AF6 0xF0U
#define OUTPUT_OD_AF7 0XF8U 开漏复用7
__STATIC_INLINE void P0_0_set(void){ PORT0->OMR = 0x00000001UL; }
__STATIC_INLINE void P0_0_reset(void){ PORT0->OMR = 0x00010000UL; }
__STATIC_INLINE void P0_0_toggle(void){ PORT0->OMR = 0x00010001UL; }
(3)硬件控制的IO
PORTn->HWSEL允许选择不同的硬件”主机。 例如:
_STATIC_INLINE void P0_0_set_hwsel(uint32_t config) {
PORT0->HWSEL &= ~0x00000003UL; PORT0->HWSEL |= config << 0; }
(4)省电模式
例如:
__STATIC_INLINE void P0_0_enable_pps(void) {
PORT0->PPS |= 0x00000001UL; }
__STATIC_INLINE void P0_0_disable_pps(void) {
PORT0->PPS &= ~0x00000001UL; }
三.IO口操作流程示例 #include
SCU_GENERAL->PASSWD = 0x000000C0UL; SCU_CLK->CLKCR = 0x3FF00400UL; // 8 MHz MCLK, 8 MHz PCLK while((SCU_CLK->CLKCR)&0x40000000UL); // 等待VDDC电压稳定 SCU_GENERAL->PASSWD = 0x000000C3UL;
P0_0_set_mode(INPUT); // P0_0为不激活拉器件输入 P0_1_set_mode(OUTPUT_PP_GP); // 推挽通用输出
P0_6_set_mode(OUTPUT_PP_GP); // P0_7_set_mode(OUTPUT_PP_GP); // }
void PORTS_Handler(void) { if (P0_0_read()==0) { P0_1_set(); P0_6_reset(); P0_7_toggle(); } else { P0_1_reset(); P0_6_set(); P0_7_toggle(); } }
// // // // // //
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库英飞凌IO学习总结在线全文阅读。
相关推荐: