KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记7 - STM32的CAN学习与测试2

这篇具有很好参考价值的文章主要介绍了KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记7 - STM32的CAN学习与测试2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前文回顾

根据《KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记6 - STM32的CAN学习与测试1》的讨论,我实现了单机的回环模式的CAN测试。后来在测试中又有下面的积累。

  1. 在回环模式下,不会有ACK检定,也不会有ACK不应答的报警。 由于CANTX实际上并不把数据发给CAN收发器,只是在芯片里面转一圈就到了CANRX。根据手册的说明,这个过程中是不会有ACK检定。所以不会在CAN_ESR中有ACK ERROR(LEC为3)的指示。参考手册《RM0090 Reference manual - STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 advanced Arm®-based 32-bit MCUs》1082页的说明。

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记7 - STM32的CAN学习与测试2,汇编设计,KEIL 5.38的GNU和ARM汇编,MCU使用心得,arm开发,汇编,学习

  1. 可以通过CAN_MCR的第4位NART位和CAN_TSR的ABRQx位来中止当前的发送请求。 如果在DEBUG模式中不小心产生了Transmission错误,比如关掉了回环模式并直接去发送数据。在示波器上会看到数据不停的发送,并且相关的CAN_ESR中有错误指示。这个时候复位CAN_TIxR的TXRQ位是复不了位的。必须通过置位CAN_TSR的ABRQx位来中止掉当前的发送。究其原因,是因为默认的情况下,CAN_MCR的第4位NART位是0,意思是开启自动重新发送。所以一旦检测到错误,CAN外设就会一直尝试发送。有人认为这个最好还是关了。但是笔者目前没有偏好。

二、 双机通讯的发送测试

2.1 一个注意事项

说起这个测试,笔者犯了一个小失误。那就是在debug之前要记得检查一下板子上的BOOT0和BOOT1口的电平是否是正确的。参考手册的第69页的表2。

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记7 - STM32的CAN学习与测试2,汇编设计,KEIL 5.38的GNU和ARM汇编,MCU使用心得,arm开发,汇编,学习

这里,如果要从Flash启动,BOOT0端一定要确认接地,悬空可能会导致歧义。DEBUG的时候也许一切正常,一旦脱机使用,就发现程序不能用了。所以要用跳线帽把BOOT0都和GND连好。双机或者多机通讯的时候板子比较多,很有可能会出现这种失误。我的接线如下所示。

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记7 - STM32的CAN学习与测试2,汇编设计,KEIL 5.38的GNU和ARM汇编,MCU使用心得,arm开发,汇编,学习

2.2 测试环境

测试用到的开发板、相关的软件和设备如下表所示。

名称 型号
开发板 HX32F4开发板2块
示波器 鼎阳SDS3104X HD
IDE Keil 5

2.3 测试代码

和上一期的代码很相似,只是我们这次不用进入回环模式了。所有的代码如下所示

	get peripherials.s
rRCC	rn 	r8
rGPIOB	rn 	r9
rCAN1	rn	r10

	import SystemCoreClockUpdate
	
	area text, code	
	align 4
	preserve8 
init	proc
	push {r4 - r11, lr}
	
	; Enable the clocks. 
	; APB1 for CAN1, AHB1 for GPIOB
	ldr rRCC, =RCC_BaseAddr
	ldr  r4, [rRCC, #RCC_AHB1ENR]
	orr  r4, #RCC_AHB1ENR_GPIOBEN
	str  r4, [rRCC, #RCC_AHB1ENR]
	ldr  r4, [rRCC, #RCC_APB1ENR]
	orr  r4, #RCC_APB1ENR_CAN1EN
	str  r4, [rRCC, #RCC_APB1ENR]
	
	; Configure the pins for CAN1
	; CAN_TX: PB8, AF9
	; CAN_RX: PB9, AF9
	ldr  rGPIOB, =GPIOB_BaseAddr
	ldr  r4, [rGPIOB, #GPIOx_MODER]
	bfc  r4, #16, #4
	orr  r4, #(GPIOx_MODER_AFIO:shl:16):or:(GPIOx_MODER_AFIO:shl:18)
	str  r4, [rGPIOB, #GPIOx_MODER]
	ldr  r4, [rGPIOB, #GPIOx_OSPEEDR]
	bfc  r4, #16, #4
	orr  r4, #(GPIOx_OSPEEDR_VERYHIGH:shl:16):or:(GPIOx_OSPEEDR_VERYHIGH:shl:18)
	str  r4, [rGPIOB, #GPIOx_OSPEEDR]
	ldr  r4, [rGPIOB, #GPIOx_PUPDR]
	bfc  r4, #16, #4
	orr  r4, #(GPIOx_PUPDR_PU:shl:16):or:(GPIOx_PUPDR_PU:shl:18)
	str  r4, [rGPIOB, #GPIOx_PUPDR]
	ldr  r4, [rGPIOB, #GPIOx_AFRH]
	bfc  r4, #0, #4
	orr  r4, #(9:shl:0) :or: (9:shl:4)
	str	 r4, [rGPIOB, #GPIOx_AFRH]
	
	; Setup the CAN1
	ldr rCAN1, =CAN1_BaseAddr
	
	; Trans to Initialisation Mode
	ldr  r4, [rCAN1, #CAN_MCR]
	bic  r4, #CAN_MCR_SLEEP
	orr	 r4, #CAN_MCR_INRQ
	str	 r4, [rCAN1, #CAN_MCR]
	
	; Set the Baudrate
	; CAN1 is at APB1. 
	push {r0}
	ldr  r4, =SystemCoreClockUpdate
	blx  r4
	lsr  r4, r0, #2
	; Now f_apb1 is r4.
	pop  {r1}
	
	; TS1 and TS2 are 3, BRP + 1 is r4.
	; Enable the loop-back mode
	udiv r4, r4, r1
	mov  r5, #9
	udiv r4, r4 ,r5
	sub  r4, #1
	mov  r5, #3
	ldr  r6, [rCAN1, #CAN_BTR]
	bfc  r6, #16, #6
	bfi	 r6, r4, #0, #10
	bfi	 r6, r5, #16, #4
	bfi	 r6, r5, #20, #3
	str  r6, [rCAN1, #CAN_BTR]
	
	; Set the filter
	ldr  r4, [rCAN1, #CAN_FM1R]
	orr	 r4, #1:shl:0
	str  r4, [rCAN1, #CAN_FM1R]
	
	; The filtered STID is 11, data frame
	; Enable the filter F0R1
	mov  r4, #11:shl:21
	str  r4, [rCAN1, #CAN_F0R1]
	ldr  r4, [rCAN1, #CAN_FA1R]
	orr  r4, #1:shl:0
	str  r4, [rCAN1, #CAN_FA1R]
	ldr  r4, [rCAN1, #CAN_FMR]
	bic  r4, #1:shl:0
	str  r4, [rCAN1, #CAN_FMR]
	
	; Switch CAN1 Peripherial from Initialisation to Normal State
	ldr  r4, [rCAN1, #CAN_MCR]
	bic  r4, #1:shl:0
	str  r4, [rCAN1, #CAN_MCR]
	
	
	; Make a test
	ldr  r4, =Test_String
	ldr  r4, [r4]
	str  r4, [rCAN1, #CAN_TDL0R]
	mov  r4, #4
	ldr  r5, [rCAN1, #CAN_TDT0R]
	bfi  r5, r4, #0, #3
	str  r5, [rCAN1, #CAN_TDT0R]
	ldr  r4, [rCAN1, #CAN_TI0R]
	
	mov  r4, #11:shl:21
	str  r4, [rCAN1, #CAN_TI0R]
	
	
	pop	 {r4 - r11, lr}
	bx	 lr
	
Test_String	dcb	"Andy"	
	endp
	align 4	
can1 dcd	init
	export can1	
		
	end

关于这段代码就没有什么好讲的了。因为每一部分的功能都在上一期讲到了。

有人可能会认为,我应该把尽可能多的常数定义成符号(注意,C语言里面的宏和汇编中的符号不是一回事。符号是在编译和链接过程中都有效的;而宏只要过了预编译就不存在了)。比如,用把1:shl:0定义成CAN_MCR_INRQ。这样会显得专业一点。我非常同意您的看法。我会在后面的版本中改正。

编译,链接。分别下载两块开发板。只不过在第二块开发板上点debug进去。

三、测试结果

还是那个熟悉的调试界面。还是点击TI0R的TXRQ,我们通过0号邮箱发送一个数据帧出去。
KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记7 - STM32的CAN学习与测试2,汇编设计,KEIL 5.38的GNU和ARM汇编,MCU使用心得,arm开发,汇编,学习

暂时先不去看接收那边。用示波器直接看波形分析。

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记7 - STM32的CAN学习与测试2,汇编设计,KEIL 5.38的GNU和ARM汇编,MCU使用心得,arm开发,汇编,学习
根据CAN的协议,ACK那个位必须是总线系统中其他的设备来填。不可以你自己发包自己填ACK。那么从这个波形分析中可以看到一个完整的数据帧了。

关于上一期说到的那个这个示波器的协议解析选件的BUG,在没有ACK应答的时候确实会出现不好确认ACK ERROR的问题。但是在ACK应答正常的情况下,SDS3104X HD是不出这个BUG的。

四、结论和下一步工作

通过上面的讨论可以看出,每一块开发板都可以通过CAN总线在这样一个多主系统中发出邮件。下一步需要做一套收发程序,或者通过两个电脑开DEBUG的方法测试接收的情况。文章来源地址https://www.toymoban.com/news/detail-837154.html

到了这里,关于KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记7 - STM32的CAN学习与测试2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • keil MDK 5.38版本 在Debug配置使用STlink调试时,软件闪退

    参考: keil5.38 debug配置STlink调试,软件闪退 使用 ST-Link 调试器时 MDK uVision 崩溃 问题情况如下: 下载下来,覆盖原来的文件就好了 CSDN资源下载链接在此 网盘链接在此

    2024年02月16日
    浏览(47)
  • Keil MDK ARM v5.38安装

    STM32开发环境为例: 链接:https://pan.baidu.com/s/16sOOZDubCbhedoDJewSlGg?pwd=yg8r 提取码:yg8r 步骤一: 链接:https://pan.baidu.com/s/1Bnvh7DmkLfZii6VC8-vLQg?pwd=lax3 提取码:lax3 下载完成解压缩选中KeilMDK538.exe右键以管理员身份运行 安装路径,默认或者自行更改都可以 客户信息随便填 等待安装完

    2023年04月09日
    浏览(40)
  • ARM学习笔记_1 介绍,Keil环境搭建

    学习自b站一口linux老师的课程。 学习ARM需要学计算机原理,汇编,C语言,基本电路,硬件控制器原理,以及编写相应驱动程序。 了解系统启动、上电、函数调用等底层实现。 真正地提高函数运行效率。 一些软件的破解…… 设计微处理器架构的公司,包含三类:cortex-A, -R

    2024年02月05日
    浏览(36)
  • Keil MDK配置ARM汇编/C语言混合开发环境

    1. 安装Keil MDK 安装方法这里不再说明,懂得都懂!🐶 2. 安装ARM开发包 在Keil MDK5之后,不再原生支持ARM7/9,需要自行安装软件包,链接在这,注意安装与自己MDK版本对应的那个包 我的版本是5.18,下载之后傻瓜式安装,因为它会自动检测你MDK所在的位置。 3. 新建工程 注意:选

    2024年02月02日
    浏览(52)
  • 【Keil5报错】:Error: Cannot load driver ‘D:\Keil_v5\ARM\SeggerJL2CM3.dll“

            新装keil5,装完jlik下载时,发现问题: Error: Cannot load driver \\\'D:Keil_v5ARMSeggerJL2CM3.dll\\\".   问题描述          Error: Cannot load driver \\\'D:Keil_v5ARMSeggerJL2CM3.dll\\\"         在系统环境中添加环境路径: D:Keil_v5ARMSegger         下载最新版本 Jlink 下载链接: SEGGER - The Em

    2024年02月12日
    浏览(38)
  • 解决keil5.38编译stm32报四个错误问题,无需更换ARM5编译器

     以上为错误截图,一下为错误信息 Start/core_cm3.c(445): error: non-ASM statement in naked function is not supported   uint32_t result=0;   ^ Start/core_cm3.c(442): note: attribute is here uint32_t __get_PSP(void) __attribute__( ( naked ) );                                           ^ Start/core_cm3.c(465): error: paramet

    2024年02月11日
    浏览(85)
  • keil5.38a 版本报错 *** Target ‘Target 1‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not ava

    *** Target \\\'Target 1\\\' uses ARM-Compiler \\\'Default Compiler Version 5\\\' which is not available. 这个错误是由于使用的 ARM 编译器“Default Compiler Version 5”不可用导致。 原因是新版的keil不在自动下载v5版本的编译器,但是老版本使用的v5,所以需要手动安装v5的编译器。 解决办法如下 下载v5.06的编译器

    2024年02月08日
    浏览(29)
  • 【ARM64 常见汇编指令学习 12 -- ARM 汇编函数 的学习】

    上篇文章:ARM64 常见汇编指令学习 11 – ARM 汇编宏 .macro 的学习 下篇文章:ARM64 常见汇编指令学习 13 – ARM 汇编 ORG 伪指令学习 ARM汇编中的函数定义并不像高级语言那样有特定的语法,但通常可以通过 标签(label) 和 子程序调用指令 (如BL,BLX) 来实现类似于函数的功能。 例如

    2024年02月14日
    浏览(37)
  • ARM64 常见汇编指令学习 11 -- ARM 汇编宏 .macro 的学习

    下篇文章:ARM64 常见汇编指令学习 12 – ARM 汇编函数 的学习 上篇文章:ARM64 常见汇编指令学习 10 – 无符号位域提取指令 BFXIL 在 ARM 汇编中,“ .macro ” 是用来定义一个宏的指令。宏可以看作是一个可以在汇编程序中重用的代码段。当调用宏时,汇编器会将宏的内容插入到调

    2024年02月14日
    浏览(33)
  • 【ARM64 常见汇编指令学习 13 -- ARM 汇编 ORG 伪指令学习】

    上篇文章:ARM64 常见汇编指令学习 12 – ARM 汇编函数 的学习 下篇文章:ARM64 常见汇编指令学习 14 – ARM 汇编 .balign,.balignw,.balign 伪指令学习 在ARM汇编中,\\\" org \\\"是一个汇编器伪指令,用于设置下一条指令的装入地址。\\\" org \\\"后面跟着的是一个表达式,这个表达式的值就是下一条

    2024年02月14日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包