[原创] 使用HAL库点灯

EETUX   2018-7-6 10:03 楼主
因为须要使用到符号表,首先重新编译micropython固件 顺便修改makefile,移除-fdata-sections -ffunction-sections选项, -fdata-sections -ffunction-sections 配合 --gc-sections 会删除未被使用的函数。 后果就是固件体积会大些。(把--gc-sections也拿掉编不过......) 获得相关库函数地址 可以用readelf 可以看.map文件 或者用ida 等等 忽略地址最后一位,应该都是一样的 下面写段代码,实现传参与跳转
  1. @micropython.asm_thumb
  2. def F(r0,r1,r2,r3):
  3. data(2,0x4798)
  4. align(2)
  5. HAL_GPIO_WritePin_FuncAddr = 0x0804f7d4
  6. HAL_GPIO_TogglePin_FuncAddr = 0x0804f7de
  7. HAL_GPIO_ReadPin_FuncAddr = 0x0804f7c8
  8. def PY_HAL_GPIO_WritePin(GPIO_TypeDef_Addr, GPIO_Pin, PinState):
  9. F(GPIO_TypeDef_Addr,GPIO_Pin,PinState,HAL_GPIO_WritePin_FuncAddr|1)
  10. def PY_HAL_GPIO_TogglePin(GPIO_TypeDef_Addr, GPIO_Pin):
  11. F(GPIO_TypeDef_Addr,GPIO_Pin,0,HAL_GPIO_TogglePin_FuncAddr|1)
  12. def PY_HAL_GPIO_ReadPin(GPIO_TypeDef_Addr, GPIO_Pin):
  13. return F(GPIO_TypeDef_Addr,GPIO_Pin,0,HAL_GPIO_ReadPin_FuncAddr|1)
具体细节没有研究,看上去是可以工作的 测试如下: 此内容由EEWORLD论坛网友EETUX原创,如需转载或用于商业用途需征得作者同意并注明出处 本帖最后由 EETUX 于 2018-7-6 10:08 编辑
  • cat_map.png
  • ida.png
  • test.png

回复评论 (1)

也可以直接访问寄存器

  1. import stm

  2. # LED1/PA13
  3. LED1 = 13
  4. stm.mem16[stm.GPIOA+stm.GPIO_BSRRL]|=(1<<LED1)

  5. # LED4/PB4
  6. LED4 = 4
  7. stm.mem16[stm.GPIOB+stm.GPIO_BSRRL]|=(1<<LED4)
点赞  2018-7-6 14:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复