zengxing3624 发表于 2021-10-29 08:33

HC32F460写端口不改变状态问题

由于某种原因,使用了华大的单片机,在写LCD的时候,遇到问题,LED数据线是接在A0~A7,使用PORT_SetPortData函数时发现只改变以前是0的Bit,如上一数据发的是01010101,下一数据发的是10101010,那么端口执行完这两个代码时,状态就是11111111,数据明显不对,检查PORT_SetPortData函数如下:

en_result_t PORT_SetPortData(en_port_t enPort, uint16_t u16Pin)
{
    uint16_t *PODRx;

    /* parameter check */
    DDL_ASSERT(IS_VALID_PORT(enPort));

    PODRx = (uint16_t *)((uint32_t)(&M4_PORT->PODRA) + 0x10u * enPort);
    *PODRx |= u16Pin;
    return Ok;
}

发现问题,端口的输出是*PODRx |= u16Pin;是|=写入的数据,这个按位或肯定就是不对的了,如果是整个16位一起写,直接把这个改成*PODRx = u16Pin;就可以了,但我用的是低8位,所以我新起了一个函数如下:

en_result_t PORT_SetPortData8(en_port_t enPort, uint16_t u16Pin)
{
    uint16_t *PODRx;

    /* parameter check */
    DDL_ASSERT(IS_VALID_PORT(enPort));

    PODRx = (uint16_t *)((uint32_t)(&M4_PORT->PODRA) + 0x10u * enPort);
    *PODRx&=0xff00;
    *PODRx |= u16Pin;
    return Ok;

kiwis66 发表于 2021-11-1 10:09

确定配置没有问题?
是控制LCD还是LED?

sadicy 发表于 2021-11-3 14:13

没太看懂,等着高手解答~~

wubangmi 发表于 2021-11-9 08:57

库函数只负责把该置位的位置位,你不能说库函数不对,按照楼主的用法你按照自己的应用改一下库函数也没什么错

tianqi911 发表于 2021-11-9 09:56

我也没看懂 华大入门者 。。。好惨,哪位高人有相关QQ群或者组织吗?单枪匹马好痛苦。

martinhu 发表于 2021-11-9 11:26

SetIO只是置位的功能,如果你想对整组写0或写1,你可以直接写寄存器,M4_PORT->PODRA = u16Pin;,
或者用置位寄存器M4_PORT->POSRA:对应bit写1输出高电平,或者复位寄存器M4_PORT->PORRA:对应bit写1输出低电平

zengxing3624 发表于 2021-11-11 19:02

martinhu 发表于 2021-11-9 11:26
SetIO只是置位的功能,如果你想对整组写0或写1,你可以直接写寄存器,M4_PORT->PODRA = u16Pin;,
或者用置 ...

感谢高手回答,
页: [1]
查看完整版本: HC32F460写端口不改变状态问题