当前位置: 首页 > news >正文

GPIO端口之AFIO的完全映射与部分映射的理解

一、问题与现象:

最近在用GD32F303VET6配置CAN的时候出现问题:
1、CAN不能正常收发,(检查之后是我疏忽,没有开启CAN时钟)
2、但是,我将CAN时钟开启之后,并没有解决CAN收发的问题,并且还导致了新的问题,屏幕显示有问题了。花屏,并且不能界面切换。
用到的引脚是:PB8 PB9

datasheet引脚说明

二、分析排查:

刚开始的代码如下:液晶屏显示正常,正常按键切换画面,CAN不能收发。

static void bsp_can_gpio_init(void)
{
    rcu_periph_clock_enable((rcu_periph_enum) CAN_RCU_GPIO );
    
    rcu_periph_clock_enable((rcu_periph_enum) CAN_RCU_AFIO);

    //RX
    gpio_init(CAN_GPIO_PORT,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,CAN_RX_GPIO_PIN);
    
    //TX
    gpio_init(CAN_GPIO_PORT,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,CAN_TX_GPIO_PIN);
    
    gpio_pin_remap_config(GPIO_CAN_FULL_REMAP, ENABLE);  
}   

经过排查,首先有一点就是:没有开CAN时钟。所以。起开CAN时钟。就有如下代码:

static void bsp_can_gpio_init(void)
{
    rcu_periph_clock_enable(RCU_CAN0);  
  
    rcu_periph_clock_enable((rcu_periph_enum) CAN_RCU_GPIO );
    
    rcu_periph_clock_enable((rcu_periph_enum) CAN_RCU_AFIO);

    //RX
    gpio_init(CAN_GPIO_PORT,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,CAN_RX_GPIO_PIN);
    
    //TX
    gpio_init(CAN_GPIO_PORT,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,CAN_TX_GPIO_PIN);
    
    gpio_pin_remap_config(GPIO_CAN_FULL_REMAP, ENABLE);   
}   

这个时候,不但CAN收发功能没有好,而且导致了液晶显示花屏。比较郁闷。就看手册,看原来图。慢慢的感觉,好多东西还是得从手册中去找,去理解。

但当我将gpio_pin_remap_config(GPIO_CAN_FULL_REMAP, ENABLE) 修改为 gpio_pin_remap_config(GPIO_CAN_PARTIAL_REMAP, ENABLE); 的时候,CAN收发正常,并且液晶显示也好了。正常的代码如下:

static void bsp_can_gpio_init(void)
{
    rcu_periph_clock_enable(RCU_CAN0);  
  
    rcu_periph_clock_enable((rcu_periph_enum) CAN_RCU_GPIO );
    
    rcu_periph_clock_enable((rcu_periph_enum) CAN_RCU_AFIO);

    //RX
    gpio_init(CAN_GPIO_PORT,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,CAN_RX_GPIO_PIN);
    
    //TX
    gpio_init(CAN_GPIO_PORT,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,CAN_TX_GPIO_PIN);
    
    gpio_pin_remap_config(GPIO_CAN_PARTIAL_REMAP, ENABLE);  //配置成部分重映射就OK了
    
    //gpio_pin_remap_config(GPIO_CAN_FULL_REMAP, ENABLE);   //配置成全重映射还会导致我的设备的显示有问题。
}   

三、分析原因:

图片1来自用户手册
图片二来自库文件
图3来自GD303用户手册图4来自GD303用户手册
以上4张图,加上博文:链接: 完全重映射和部分重映射分析(超详细) 【但是就像评论中说得,博主的理解不完全正确,并不是说REMAP:后边一个外设就是完全重映射,超过一个就是部分重映射】 中举例的部分。然后我就理解了,理解如下:
还是以CAN为例:我如何确定到底是部分重映射,还是完全重映射呢?

1、我们可以查看用户手册中的GPIO部分的AFIO端口配置寄存器部分。如图:可以确认为部分重映射。

在这里插入图片描述

2、要准确的确定哪个引脚是部分映射还是全映射,还是得看官方手册中的GPIO部分的AFIO端口配置寄存器。如下图:

并不能说明:TIMER3_CH0就是部分重映射。。。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

之前的错误理解:认为Remap的都应该配置为FULL_REMAP ;Alternate默认就是PARTIAL_REMAP。太操蛋了。。。。。

在这里插入图片描述

每一个调用库函数,都是向特定寄存器中写入特定的值,那么调用gpio_pin_remap_config(GPIO_CAN_PARTIAL_REMAP, ENABLE)呢?

下边两张图:可以对应起来,配置为完全映射还是部分映射。

在这里插入图片描述
在这里插入图片描述

相关文章:

  • SpringCloud搭建微服务之Zuul网关
  • Python使用Redis计算经纬度距离
  • 可重入函数
  • ib课程北京国际学校哪里有?
  • 宠物保存服务市场现状及未来发展趋势分析
  • Three.js使用rotation旋转模型
  • 超越所有人的成就,牛顿的光芒也无法掩盖的天才数学巨人
  • C++11之智能指针
  • C++ | 高维数组、指针、返回指向数组的指针的函数
  • linux redis hash哈希 增删改查
  • OS | 【二 PV操作】强化阶段 —— 应用题
  • 超分辨率重建DRCN
  • C++ vector容器
  • 进程(fork()详解)
  • vue基础语法(上)
  • (三)从jvm层面了解线程的启动和停止
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Babel配置的不完全指南
  • docker容器内的网络抓包
  • Kibana配置logstash,报表一体化
  • markdown编辑器简评
  • nginx 负载服务器优化
  • SQLServer插入数据
  • 安卓应用性能调试和优化经验分享
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 第十八天-企业应用架构模式-基本模式
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 什么是Javascript函数节流?
  • 微信小程序--------语音识别(前端自己也能玩)
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 函数计算新功能-----支持C#函数
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ![CDATA[ ]] 是什么东东
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (33)STM32——485实验笔记
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (待修改)PyG安装步骤
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (状压dp)uva 10817 Headmaster's Headache
  • .java 9 找不到符号_java找不到符号
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net反编译的九款神器
  • .Net各种迷惑命名解释
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • [Android Pro] Notification的使用