初次使用HC32F460,看了好久小学语言水平写的手册,总算掌握了部分内容。编写程序试机,然而怎么也不能工作。
没办法就使用官方的GPIO例程,对端口控制,---- 竟然达不到目的!
------ 当然怀疑是板子问题,查呀,查呀! 查封装、查电路设计,查PCB布板,…… 查了一个遍,都没发现有关键问题!
后来在DEBUG下观察寄存器,发现端口输出正常,百思不得其解,随即把端口输出允许点了一下,马上就正常了!
最后在程序中加了一句:
M4_PORT->POERE = 0x0100;
程序正常工作。达到了预期目的。
/********************************************************************************************/
分析官网提供的hc32f460_ddl_Rev2.2.0.zip文件中的GPIO例程,原样不动地提供如下:
int32_t main(void)
{
stc_port_init_t stcPortInit;
/* configuration structure initialization */
MEM_ZERO_STRUCT(stcPortInit);
stcPortInit.enPinMode = Pin_Mode_Out;
stcPortInit.enExInt = Enable;
stcPortInit.enPullUp = Enable;
/* LED0 Port/Pin initialization */
PORT_Init(LED0_PORT, LED0_PIN, &stcPortInit);
/* LED1 Port/Pin initialization */
PORT_Init(LED1_PORT, LED1_PIN, &stcPortInit);
/* LED2 Port/Pin initialization */
PORT_Init(LED2_PORT, LED2_PIN, &stcPortInit);
/* LED3 Port/Pin initialization */
PORT_Init(LED3_PORT, LED3_PIN, &stcPortInit);
while(1)
{
LED0_TOGGLE();
Ddl_Delay1ms(DLY_MS);
LED1_TOGGLE();
Ddl_Delay1ms(DLY_MS);
LED2_TOGGLE();
Ddl_Delay1ms(DLY_MS);
LED3_TOGGLE();
Ddl_Delay1ms(DLY_MS);
/* de-init if necessary */
//PORT_DeInit();
};
}
在while前,只有一个PORT_Init函数,我们也把它提供出来(执行部分):
PCRx = (stc_port_pcr_field_t *)((uint32_t)(&M4_PORT->PCRA0) + \
enPort * 0x40ul + u8PinPos * 0x04ul);
PFSRx = (stc_port_pfsr_field_t *)((uint32_t)(&M4_PORT->PFSRA0) + \
enPort * 0x40ul + u8PinPos * 0x04ul);
/* Input latch function setting */
PCRx->LTE = pstcPortInit->enLatch;
/* External interrupt input enable setting */
PCRx->INTE = pstcPortInit->enExInt;
/* In_Out invert setting */
PCRx->INVE = pstcPortInit->enInvert;
/* Pin pull-up setting */
PCRx->PUU = pstcPortInit->enPullUp;
/* CMOS/OD output setting */
PCRx->NOD = pstcPortInit->enPinOType;
/* Pin drive mode setting */
PCRx->DRV = pstcPortInit->enPinDrv;
/* Pin mode setting */
switch (pstcPortInit->enPinMode)
{
case Pin_Mode_In:
PCRx->DDIS = 0u;
PCRx->POUTE = 0u;
break;
case Pin_Mode_Out:
PCRx->DDIS = 0u;
PCRx->POUTE = 1u;
break;
case Pin_Mode_Ana:
PCRx->DDIS = 1u;
break;
default:
break;
}
/* Sub function enable setting */
PFSRx->BFE = pstcPortInit->enPinSubFunc;
前面两句,是分别为PCRx 、PFSRx 赋值作准备(两个寄存器地址)。接下来的程序也仅对两个寄存器操作。而LEDx_TOGGLE也仅对翻转寄存器操作。没有牵扯到其它寄存器。
而460手册的POERx、PCRxy说明,输出需要将相应位设置为允许。
但在例程中,怎么也找不到对这两个(或一个)寄存器的操作。
/-----------------------------------------------------------------------------------------------------------------------------/
我现在纳闷,要么是手册错了?要么是例程错了?
-----------------或者我理解不到位,请厂家或牛人斧正!
|