硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1879|回复: 3
收起左侧

[Lua] 维修一个STM32-V5主板,用H7-TOOL的lua小程序排障(进行中)

[复制链接]

759

主题

1050

回帖

3332

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3332
发表于 2022-7-14 09:48:38 | 显示全部楼层 |阅读模式
客户早期购买的一个V5开发板主板,根据故障现象,估计FSMC总线上有个走线或过孔处于临界断路状态。需要排查是哪个线。

准备写个lua小程序辅助排查故障。
基本思路:低速翻转相关的GPIO,方便维修人员用万用表就测量GPIO状态。同时不会破坏主板内原有程序。
STM32F407_GpioTest.lua (6.86 KB, 下载次数: 21)


总线相关的GPIO :
                PD0/FSMC_D2
                PD1/FSMC_D3
                PD4/FSMC_NOE
                PD5/FSMC_NWE
                PD8/FSMC_D13
                PD9/FSMC_D14
                PD10/FSMC_D15
                PD11/FSMC_A16
                PD12/FSMC_A17
                PD13/FSMC_A18
                PD14/FSMC_D0
                PD15/FSMC_D1

                PE0/FSMC_NBL0
                PE1/FSMC_NBL1
                PE3/FSMC_A19
                PE4/FSMC_A20        -- 参与片选的译码
                PE5/FSMC_A21        -- 参与片选的译码
                PE7/FSMC_D4
                PE8/FSMC_D5
                PE9/FSMC_D6
                PE10/FSMC_D7
                PE11/FSMC_D8
                PE12/FSMC_D9
                PE13/FSMC_D10
                PE14/FSMC_D11
                PE15/FSMC_D12

                PF0/FSMC_A0
                PF1/FSMC_A1
                PF2/FSMC_A2
                PF3/FSMC_A3
                PF4/FSMC_A4
                PF5/FSMC_A5
                PF12/FSMC_A6
                PF13/FSMC_A7
                PF14/FSMC_A8
                PF15/FSMC_A9

                PG0/FSMC_A10
                PG1/FSMC_A11
                PG2/FSMC_A12
                PG3/FSMC_A13
                PG4/FSMC_A14
                PG5/FSMC_A15
                PG10/FSMC_NE3        --- 片选主信号



[Lua] 纯文本查看 复制代码
--以下快捷方式将显示在PC软件界面-------------
--F01=开始翻转,TeseFsmc()

print("STM32-V5 GPIO翻转程序 V1.0")
print("为避免主板程序影响")
print("请按住BOOT0键")
print("再按一下RESET键")

beep()
pg_init()

PERIPH_BASE = 0x40000000
AHB1PERIPH_BASE = PERIPH_BASE + 0x00020000
RCC_BASE = AHB1PERIPH_BASE + 0x3800
RCC_AHB1ENR = RCC_BASE + 0x30

RCC_AHB1Periph_GPIOA = (0x00000001)
RCC_AHB1Periph_GPIOB = (0x00000002)
RCC_AHB1Periph_GPIOC = (0x00000004)
RCC_AHB1Periph_GPIOD = (0x00000008)
RCC_AHB1Periph_GPIOE = (0x00000010)
RCC_AHB1Periph_GPIOF = (0x00000020)
RCC_AHB1Periph_GPIOG = (0x00000040)
RCC_AHB1Periph_GPIOH = (0x00000080)
RCC_AHB1Periph_GPIOI = (0x00000100) 
RCC_AHB1Periph_GPIOJ = (0x00000200)
RCC_AHB1Periph_GPIOK = (0x00000400)

GPIOA = AHB1PERIPH_BASE + 0x0000
GPIOB = AHB1PERIPH_BASE + 0x0400
GPIOC = AHB1PERIPH_BASE + 0x0800
GPIOD = AHB1PERIPH_BASE + 0x0C00
GPIOE = AHB1PERIPH_BASE + 0x1000
GPIOF = AHB1PERIPH_BASE + 0x1400
GPIOG = AHB1PERIPH_BASE + 0x1800
GPIOH = AHB1PERIPH_BASE + 0x1C00
GPIOI = AHB1PERIPH_BASE + 0x2000
GPIOJ = AHB1PERIPH_BASE + 0x2400
GPIOK = AHB1PERIPH_BASE + 0x2800

MODER = 0x00
OTYPER = 0x04
OSPEEDR = 0x08
PUPDR = 0x0C
IDR = 0x10
ODR = 0x14
BSRRL = 0x18
BSRRH = 0x1A
LCKR = 0x1C
AFR0 = 0x20
AFR1 = 0x24

GPIO_Mode_IN   = 0x00 --GPIO Input Mode
GPIO_Mode_OUT  = 0x01 --GPIO Output Mode
GPIO_Mode_AF   = 0x02 --GPIO Alternate function Mode
GPIO_Mode_AN   = 0x03 --GPIO Analog Mode

GPIO_OSPEEDER_OSPEEDR0  = 0x00000003
GPIO_OTYPER_OT_0  = 0x00000001

GPIO_Low_Speed     = 0x00  --/*!< Low speed    */
GPIO_Medium_Speed  = 0x01  --/*!< Medium speed */
GPIO_Fast_Speed    = 0x02  --/*!< Fast speed   */
GPIO_High_Speed    = 0x03  --/*!< High speed   */
  
GPIO_OType_PP = 0x00	--推挽输出
GPIO_OType_OD = 0x01	--开漏输出
 
GPIO_PUPDR_PUPDR0 = 0x00000003
 
GPIO_PuPd_NOPULL = 0x00
GPIO_PuPd_UP     = 0x01
GPIO_PuPd_DOWN   = 0x02
  
--开启GPIO时钟
function enable_gpio_clk(void)
	rcc = RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC
		| RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE
		| RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH
		| RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOJ | RCC_AHB1Periph_GPIOK
	pg_write32(RCC_AHB1ENR, rcc)
end

--配置GPIO为推挽输出 (上下拉电阻未配置)
function config_gpio_out_pp(gpio, pin)
	local moder
	local otyper
	local ospeedr
	local pupdr
	
	moder = pg_read32(gpio + MODER)
	moder = moder & ~(0x03 << (pin * 2))
	moder = moder | (GPIO_Mode_OUT << (pin * 2))	
	pg_write32(gpio + MODER, moder)
	
    --Speed mode configuration
	ospeedr = pg_read32(gpio + OSPEEDR)	
    ospeedr = ospeedr & ~(GPIO_OSPEEDER_OSPEEDR0 << (pin * 2))
    ospeedr = ospeedr | (GPIO_High_Speed << (pin * 2))
	pg_write32(gpio + OSPEEDR, ospeedr)

	--Output mode configuration
	otyper = pg_read32(gpio + OTYPER)	
    otyper = otyper & ~(GPIO_OTYPER_OT_0 << pin)
    otyper = otyper | (GPIO_OType_PP << pin)
	pg_write32(gpio + OTYPER, otyper)
	
    --Pull-up Pull down resistor configuration*/
	pupdr = pg_read32(gpio + PUPDR)	
    pupdr = pupdr & ~(GPIO_PUPDR_PUPDR0 << (pin * 2))
    pupdr = pupdr | (pupdr << (pin * 2))
	pg_write32(gpio + PUPDR, pupdr)	
end

function set_gpio(gpio, pin, level)
	if (level == 0) then
		pg_write32(gpio + BSRRH, (1 << pin))		
	else
		pg_write32(gpio + BSRRL, (1 << pin))		
	end
end

function ConfigFsmcOut(void)
	config_gpio_out_pp(GPIOD, 0)
	config_gpio_out_pp(GPIOD, 1)
	config_gpio_out_pp(GPIOD, 4)
	config_gpio_out_pp(GPIOD, 5)
	config_gpio_out_pp(GPIOD, 8)
	config_gpio_out_pp(GPIOD, 9)
	config_gpio_out_pp(GPIOD, 10)
	config_gpio_out_pp(GPIOD, 11)
	config_gpio_out_pp(GPIOD, 12)
	config_gpio_out_pp(GPIOD, 14)
	config_gpio_out_pp(GPIOD, 15)

	config_gpio_out_pp(GPIOE, 0)
	config_gpio_out_pp(GPIOE, 1)
	config_gpio_out_pp(GPIOE, 3)
	config_gpio_out_pp(GPIOE, 4)
	config_gpio_out_pp(GPIOE, 5)
	config_gpio_out_pp(GPIOE, 7)
	config_gpio_out_pp(GPIOE, 8)
	config_gpio_out_pp(GPIOE, 9)
	config_gpio_out_pp(GPIOE, 10)
	config_gpio_out_pp(GPIOE, 11)
	config_gpio_out_pp(GPIOE, 12)
	config_gpio_out_pp(GPIOE, 13)
	config_gpio_out_pp(GPIOE, 14)
	config_gpio_out_pp(GPIOE, 15)
	
	config_gpio_out_pp(GPIOF, 0)
	config_gpio_out_pp(GPIOF, 1)
	config_gpio_out_pp(GPIOF, 2)
	config_gpio_out_pp(GPIOF, 3)
	config_gpio_out_pp(GPIOF, 4)
	config_gpio_out_pp(GPIOF, 5)
	config_gpio_out_pp(GPIOF, 12)
	config_gpio_out_pp(GPIOF, 13)
	config_gpio_out_pp(GPIOF, 14)
	config_gpio_out_pp(GPIOF, 15)	

	config_gpio_out_pp(GPIOG, 0)
	config_gpio_out_pp(GPIOG, 1)
	config_gpio_out_pp(GPIOG, 2)
	config_gpio_out_pp(GPIOG, 3)
	config_gpio_out_pp(GPIOG, 4)
	config_gpio_out_pp(GPIOG, 5)
	config_gpio_out_pp(GPIOG, 10)
end

--设置FSMC GPIO = 0
function SetFsmcGpio_0(void)
	set_gpio(GPIOD, 0, 0)
	set_gpio(GPIOD, 1, 0)
	set_gpio(GPIOD, 4, 0)
	set_gpio(GPIOD, 5, 0)
	set_gpio(GPIOD, 8, 0)
	set_gpio(GPIOD, 9, 0)
	set_gpio(GPIOD, 10, 0)
	set_gpio(GPIOD, 11, 0)
	set_gpio(GPIOD, 12, 0)
	set_gpio(GPIOD, 14, 0)
	set_gpio(GPIOD, 15, 0)

	set_gpio(GPIOE, 0, 0)
	set_gpio(GPIOE, 1, 0)
	set_gpio(GPIOE, 3, 0)
	set_gpio(GPIOE, 4, 0)
	set_gpio(GPIOE, 5, 0)
	set_gpio(GPIOE, 7, 0)
	set_gpio(GPIOE, 8, 0)
	set_gpio(GPIOE, 9, 0)
	set_gpio(GPIOE, 10, 0)
	set_gpio(GPIOE, 11, 0)
	set_gpio(GPIOE, 12, 0)
	set_gpio(GPIOE, 13, 0)
	set_gpio(GPIOE, 14, 0)
	set_gpio(GPIOE, 15, 0)
	
	set_gpio(GPIOF, 0, 0)
	set_gpio(GPIOF, 1, 0)
	set_gpio(GPIOF, 2, 0)
	set_gpio(GPIOF, 3, 0)
	set_gpio(GPIOF, 4, 0)
	set_gpio(GPIOF, 5, 0)
	set_gpio(GPIOF, 12, 0)
	set_gpio(GPIOF, 13, 0)
	set_gpio(GPIOF, 14, 0)
	set_gpio(GPIOF, 15, 0)	

	set_gpio(GPIOG, 0, 0)
	set_gpio(GPIOG, 1, 0)
	set_gpio(GPIOG, 2, 0)
	set_gpio(GPIOG, 3, 0)
	set_gpio(GPIOG, 4, 0)
	set_gpio(GPIOG, 5, 0)
	set_gpio(GPIOG, 10, 0)
end

--设置FSMC GPIO = 1
function SetFsmcGpio_1(void)
	set_gpio(GPIOD, 0, 1)
	set_gpio(GPIOD, 1, 1)
	set_gpio(GPIOD, 4, 1)
	set_gpio(GPIOD, 5, 1)
	set_gpio(GPIOD, 8, 1)
	set_gpio(GPIOD, 9, 1)
	set_gpio(GPIOD, 10, 1)
	set_gpio(GPIOD, 11, 1)
	set_gpio(GPIOD, 12, 1)
	set_gpio(GPIOD, 14, 1)
	set_gpio(GPIOD, 15, 1)

	set_gpio(GPIOE, 0, 1)
	set_gpio(GPIOE, 1, 1)
	set_gpio(GPIOE, 3, 1)
	set_gpio(GPIOE, 4, 1)
	set_gpio(GPIOE, 5, 1)
	set_gpio(GPIOE, 7, 1)
	set_gpio(GPIOE, 8, 1)
	set_gpio(GPIOE, 9, 1)
	set_gpio(GPIOE, 10, 1)
	set_gpio(GPIOE, 11, 1)
	set_gpio(GPIOE, 12, 1)
	set_gpio(GPIOE, 13, 1)
	set_gpio(GPIOE, 14, 1)
	set_gpio(GPIOE, 15, 1)
	
	set_gpio(GPIOF, 0, 1)
	set_gpio(GPIOF, 1, 1)
	set_gpio(GPIOF, 2, 1)
	set_gpio(GPIOF, 3, 1)
	set_gpio(GPIOF, 4, 1)
	set_gpio(GPIOF, 5, 1)
	set_gpio(GPIOF, 12, 1)
	set_gpio(GPIOF, 13, 1)
	set_gpio(GPIOF, 14, 1)
	set_gpio(GPIOF, 15, 1)	

	set_gpio(GPIOG, 0, 1)
	set_gpio(GPIOG, 1, 1)
	set_gpio(GPIOG, 2, 1)
	set_gpio(GPIOG, 3, 1)
	set_gpio(GPIOG, 4, 1)
	set_gpio(GPIOG, 5, 1)
	set_gpio(GPIOG, 10, 1)
end

function TeseFsmc(void)
	local i
	
	enable_gpio_clk()
	
	config_gpio_out_pp(GPIOI, 10)
	
	beep()
	print("Test FSMC ...")
	ConfigFsmcOut()

	for i = 0, 10, 1 do
		print(i)
		SetFsmcGpio_0()
		set_gpio(GPIOI, 10, 0)
		delayms(2000)
		
		SetFsmcGpio_1()
		set_gpio(GPIOI, 10, 1)
		delayms(2000)
	end	
	beep()
end






回复

使用道具 举报

7

主题

194

回帖

220

积分

高级会员

积分
220
发表于 2022-11-8 15:48:29 | 显示全部楼层
这个是把h7-tool的引脚接到V5上然后用万用表来量板子上的引脚来测试的嘛
回复

使用道具 举报

759

主题

1050

回帖

3332

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3332
 楼主| 发表于 2022-11-8 16:43:14 | 显示全部楼层
abcde1224 发表于 2022-11-8 15:48
这个是把h7-tool的引脚接到V5上然后用万用表来量板子上的引脚来测试的嘛

将H7-TOOL的的SWD接口插到V5主板的SWD调试口,运行这个lua。GPIO就会翻转间隔2秒。万用表就可以看到3.3V   0V 的跳变。
回复

使用道具 举报

7

主题

194

回帖

220

积分

高级会员

积分
220
发表于 2022-11-12 13:21:22 | 显示全部楼层
armfly 发表于 2022-11-8 16:43
将H7-TOOL的的SWD接口插到V5主板的SWD调试口,运行这个lua。GPIO就会翻转间隔2秒。万用表就可以看到3.3V  ...

噢噢明白了,硬汉哥Lua脚本是怎么通过串口加载到h7-tool的lua虚拟机中去的啊,有点没想明白,是转换成数组后类似于串口调试指令这样的嘛,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-3 03:24 , Processed in 0.285470 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表