打印
[技术问答]

HC32F460写端口不改变状态问题

[复制链接]
2993|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zengxing3624|  楼主 | 2021-10-29 08:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于某种原因,使用了华大的单片机,在写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 | 只看该作者
库函数只负责把该置位的位置位,你不能说库函数不对,按照楼主的用法你按照自己的应用改一下库函数也没什么错

使用特权

评论回复
5
tianqi911| | 2021-11-9 09:56 | 只看该作者
我也没看懂 华大入门者 。。。好惨,哪位高人有相关QQ群或者组织吗?单枪匹马好痛苦。

使用特权

评论回复
6
martinhu| | 2021-11-9 11:26 | 只看该作者
SetIO只是置位的功能,如果你想对整组写0或写1,你可以直接写寄存器,M4_PORT->PODRA = u16Pin;,
或者用置位寄存器M4_PORT->POSRA:对应bit写1输出高电平,或者复位寄存器M4_PORT->PORRA:对应bit写1输出低电平

使用特权

评论回复
7
zengxing3624|  楼主 | 2021-11-11 19:02 | 只看该作者
martinhu 发表于 2021-11-9 11:26
SetIO只是置位的功能,如果你想对整组写0或写1,你可以直接写寄存器,M4_PORT->PODRA = u16Pin;,
或者用置 ...

感谢高手回答,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

17

帖子

2

粉丝