STM32的PB12与PA15引脚作为IO使用时可能踩的坑

首先是PB12,通常来说PB12作为普通IO不会有什么问题,跟其他IO一样,配置好时钟与模式就能愉快地操作。
但是当SPI2被开启使用时,问题就来了,通常来说,用SPI的主模式操作外部FLASH等器件是很常见的需求,但是当你把SPI2配置为主模式时,你会发现PB12同时失灵了,原因在于,PB12的默认功能为SPI2的NSS引脚,SPI2配置为主模式时,这个Pin默认被用来作为该主设备的主从选择输入。
PB12的默认功能包括了SPI2的NSS片选信号
NSS默认为输入模式,用以选择SPI主从
因此,如果你打算把PB12拿来当普通IO,你将无法控制这个引脚。

那么,在这个情况下把SPI2_NSS配置为输出则成为了必要的操作
NSS需要置位SSOE来转换为输出
规格书上所见,需要配置SSOE才能使得SPI2_NSS转换为输出模式,于是在初始化时,加入下面一句。

SPI2->CR2 = SPI_CR2_SSOE;
//使能NSS输出,使PB12可控

你熟悉的IO操作就又回来了。

再来是PA15,这个是今天发生的事,浪费了我30分钟,所以我觉得我需要在这里记录一下。

PA15默认是JTDI
PA15在上电后是不可用的,你需要配置AFIO_MAPR寄存器的SWJ_CFG位来关闭JTAG,只保留SWD调试口来调试你的代码,这是我一直以来的常规操作,在我的GPIOInit函数内,第一句就会包含这个操作

AFIO->MAPR = AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
	//关闭JTAG 释放出PB3,PB4,PA15

但是很奇怪的是,今天不行,我怎么也控制不了PA15,它一直处于高电平的状态,因为无法拉低,我以为我的目标板存在器件损坏,或者短路到电源什么的,换了PA15驱动的IC,甚至是把外围都拆了,它还是保持高电平巍然不动,当我打算把STM32吹下来换一片新的时候,我找到另一块目标板,用同样的代码跑下来发现,PA15还是不受控。

那么,和硬件没什么关系了,是我的代码出了问题。

MDK开发环境有一个很方便的调试功能,可以直接在一个寄存器配置窗口,在线点点鼠标配置寄存器,即时生效,例如USART可以像下图这样玩
MDK的寄存器观察与配置窗口
你不需要重新编译代码运行,就可以在这里调戏你要的寄存器,并观察结果,这是一个很好的特性。

然后我打开了AFIO的窗口,它比较简陋,没有USART那样的配置,但是一样可以发现问题。
AFIO观察与配置窗口
我发现无论我更改AFIO内的任何一个内容,都不会得到执行,勾选后马上会被清除,然后我搜寻了互联网,打开了我以前的代码,最终找到答案
规格书内对AFIO寄存器描述的注意事项

就是这样,AFIO的配置需要额外打开AFIO时钟,我原来的代码里存在着一个选项,移植过来之后配置时应该是不小心删掉了

不能用的时钟配置是这样的

RCC->APB2ENR = RCC_APB2ENR_USART1EN | RCC_APB2ENR_TIM1EN | RCC_APB2ENR_SPI1EN \
				| RCC_APB2ENR_ADC1EN | RCC_APB2ENR_ADC2EN |  \
				| RCC_APB2ENR_IOPDEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPAEN;
//	

加上去后是这样的

RCC->APB2ENR = RCC_APB2ENR_USART1EN | RCC_APB2ENR_TIM1EN | RCC_APB2ENR_SPI1EN \
				| RCC_APB2ENR_ADC1EN | RCC_APB2ENR_ADC2EN | RCC_APB2ENR_AFIOEN \
				| RCC_APB2ENR_IOPDEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPAEN;
//	

然后,PA15就可控了。

PB12.5版本: 关于PBHelper(PBCOMMENT)这个软件,最新版本 1.0.2 PBHelper的前身是 PBCOMMENT 7.0。 ================================================================ 版权所有 (c) 1999-2000 RC Sizer 保留所有版权。 版权所有 (c) 2003-2006 Welkin 保留所有版权。 版权所有 (c) 2002-2006 TRUEWAY(TM) 保留所有版权。 注册商标 TRUEWAY(TM) 为李群巍所写程序专用。 PBHelper以前的名字叫 PBCOMMENT。 PBHelper(PBCOMMENT)是一个专门为PB程序员设计的综合性编程 助手工具。她能帮助PB程序员自动生成PB脚本代码注释、自动缩进美化 代码、自动完成代码、大小写转换,实现不同数据库类型之间的SQL语句 转换等功能。 PBHelper支持PowerBuilder 6.x/7.0/8.0/9.0/10.0/10.5/11.0。 (增加对11.5、12.0、12.5的支持) 关于此软件的英文详细说明,请阅读《readme.txt》。 联系方法: E-Mail: truewaylee@163.com, wolcen@sohu.com MSN: truewaylee@hotmail.com 软件包下载地址: http://gforge.osdn.net.cn/projects/pbhelper/ PBHelper(PBCOMMENT)的来历 ================================================================ PBHelper起初的代码参考了国外一个著名的 PBCOMMENT 软件。国外 的这个 PBCOMMENT 对 PB 6.0/6.5 和 PB 7.0 分别做了实现。初期的 版本主要用于自动生成函数、对象、DW内部代码的注释。后来,本人 对该软件核心代码做了重写工作,且在一个版本的 PBCOMMENT 里面 提供了对不同版本PB的支持。 从 PBCOMMENT 3.0 开始,在后续的版本中,加入了代码自动整理 (Indent)、自动完成(插入DW编码模板)、自动删除(根据某个标记) 自动删除某个标记前面的或者后面的代码,从DW自动生成DW字段赋值语句、 从DW生成结构体等的辅助功能。从这些功能的增加来看,PBCOMMENT 已 不再是 COMMENT 的工具。有鉴于此,从 PBCOMMENT 7.0 以后软件名字 更改为 PBHelper。因为 PBHelper 不再仅仅关注于注释方面,而向功能 综合化、多样性方面发展。 PBHelper(PBCOMMENT)重要版本更新 ================================================================ 开始版本号 新增功能 ---------------------------------------------------------------- PBCOMMENT >>>>>>>>>> 5.2 可以处理 *.sr* 类型的文件的整理处理 将对象、窗口、函数等代码先 Export 成文本文件,在PB中 用编辑文本文件的形式打开,然后象其他脚本一样 Indent 5.2 新增自动将工具集成到 PB 开发环境中的功能 目前支持的版本是 PB 6.0/6.5, PB 9.0 5.3 新增自动在某个代码段加每行代码的相同的前缀或者相同的后缀 这个在我们日常生活中经常要用到的 5.31 新增自动根据字段列表,变量列表,datawindow 赋值语句列表, 自动生成 datawindow 之间复制数据的代码 自动生成 结构体变量 和 datawindow 之间的赋值代码 自动生成 变量列表 和 datawindow 之间的赋值代码 具体可看 《pbcomment自动写代码.doc》的说明 5.31 新增双语言显示 pbcomment.ini 文件中, language = 0 表示简体中文
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值