Skip to content

用arduino uno给CC2541的蓝牙模块烧录程序的工具; A tool for arduino uno to program the cc2541 chip

Notifications You must be signed in to change notification settings

qingwa2009/MyProgramer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MyProgramer

arduino uno(atmega328) programer

CC2541蓝牙模块 编程器
    * .hex 文本格式烧写flash
    * .bin 二进制格式烧写flash
    
ATmega328 编程器
    * .hex 文本格式烧写flash
    * .bin 二进制格式烧写flash
    * .eep 文本格式烧写eeprom
    * .eepb 二进制格式烧写eeprom

目录说明:

buildTool: 
    是从proteus那里牛过来的,mksketch.exe用来将ino转cpp,顺带编译arduino一堆库;
    MAKE文件夹也是从proteus那里牛过来的(●ˇ∀ˇ●),make路径要加到环境变量里面去。

cc2541: 
    cc2541芯片相关的乱七八糟都丢里面了,doc里面是芯片的一些数据手册,
    exampleHex里面blinkuTest是呼吸灯的程序,
    还有一个是从https://github.com/RedBearLab/CCLoader 牛过来的HM10蓝牙模块的bin文件,
    我找来找去都找不到哪些可以用的蓝牙模块文件。

atmega328:
    atmega328芯片相关的乱七八糟都丢里面了。

mylib: 
    自己写的一些库函数

preBuild:
    已经编译好了的atmega328跟cc2541的编程器hex文件,直接用就可以了不用自己再编译一遍了:
    命令行直接输入:
    make upload UPLOAD_FILE=prebuild/cc2541.hex
    或者
    make upload UPLOAD_FILE=prebuild/atmega328.hex
    就可以将UNO烧录成对应的编程器了。

编译环境搭建:

我用的vscode编写代码,然后用proteus里面的make工具编译代码(好像是i386-pc-mingw32版本的)

Makefile里面ARDUINO_PATH要替换成自己的路径(如:D:\Program Files\Arduino)

Makefile里面UPLOAD_PORT要替换成自己的串口名

make.exe的路径要加入环境变量Path(如:D:\Program Files\Proteus 8 Professional\Tools\MAKE)

avr-gcc.exe的路径也要加入环境变量Path (如:D:\Program Files\Arduino\hardware\tools\avr\bin)

ar.exe的路径也要加入环境变量Path(如:D:\Program Files\Arduino\hardware\tools\avr\avr\bin)

上位机我用的nodejs+serialport,没有的需要安装下:
装了nodejs后,在当前目录下cmd运行 npm install 就会自动安装serialport

Makefile里面下面两句分别对应编译cc2541跟atmega328编程器,注释掉其中一句就可以了。
# TARGET_MCU_FILE = mcu_cc2541.cpp
# TARGET_MCU_FILE = mcu_atmega328.cpp
也可以不用改,在命令行输入“make TARGET_MCU_FILE=xxxxx.cpp”这样直接指定编译哪个芯片也可以。
需要注意的是因为编译后输出的文件是一样的,所以切换到另一个时编译之前要先make clean

CC2541接线:

DC<---> 5 (DEBUG_CLOCK cc2541的P2_2引脚)

DD<---> 6 (DEBUG_DATA cc2541的P2_1引脚)

RST<---> 4 (cc2541的reset引脚)

可以参考cc2541文件夹下的接线图,我连引脚都没焊,从电阻剪下一些线弯一下顶住o(* ̄▽ ̄*)o
引脚可以在myCC2541.c代码里面修改成自己要的。

关于电压,我arduino输出直接接蓝牙模块上面,没烧,还行, 电源跟接地也是直接接arduino的。

烧录cc2541:

1、接好线

2、cmd cd到当前目录 输入“make clean”清空之前的编译(可选)

3、输入“make TARGET_MCU_FILE=mcu_cc2541.cpp”编译

4、输入“make upload”上传

5、输入“node main .\cc2541\exampleHex\blinkTest.hex” 给cc2541烧录blinkTest.hex(支持hex跟bin文件)

我稀里糊涂的的把cc2541的调试功能都给写了:

调试cc2541:

用串口调试助手,波特率设置250000,输入“/h”以回车换行(\r\n)结尾
可以看到详细的使用说明,大概详细吧-_-!!! 如:

/d 进入调试模式,mcu暂停,pc计数器指到0

/r 退出调试模式,mcu正常运行

/q 是开启或者关闭arduino串口输出,这样上位机可以直接跟cc2541串口通信

...

备份cc2541:

输入“node mainCC2541backup [filename]” 备份cc2541的程序到bin文件,filename可以给也可以不给,
默认当前目录下cc2541FlashBackup.bin文件;

烧录前,能备份就备份吧,我的MLT-BT05模块没备份啥都没了,网上找来找去就找了个HM10蓝牙模块的bin文件可以用,
功能感觉比MLT-BT05强,好像-_-!!!

需要注意的是cc2541有个debug lock bit,就是防止别人调试,要是被设置了就备份不了了,备份不了时会提示的!
debug lock bit只能通过清空flash来清除。

关于蓝牙模块烧录TI官方的示例程序:

由于蓝牙模块的硬件跟示例程序的配置可能不一致,导致烧录进去无法正常运行。比较典型的情况就是:有些蓝牙模块《没焊外部32k晶振》-_-!!!,而示例程序应该全是默认存在在外部32k晶振编译的程序,所以导致程序运行不下去。
下面提供一些我用到的预编译宏,直接加到IAR->工程设置->c/c++ Compiler->Preprocessor->Defined symbols的框里面,注释不要写进去,跟已有的有冲突的话就删掉已有的:
HAL_KEY=FALSE             
HAL_LED=TRUE               
HAL_LCD=FALSE              
HAL_AES_DMA=TRUE            
HAL_DMA=TRUE                			
HAL_UART_ISR=0              
HAL_UART=TRUE               
HAL_UART_DMA=2			//使用port1的串口
NPI_UART_FC=FALSE		//关闭串口流控制
XOSC32K_INSTALLED=FALSE	//使用内部32k晶振

关于串口波特率:

我设的是250000,用115200时运行备份程序老是备份不了,少好多个字节,
大概是115200的波特率有错误率,所以设了250000,设成9600也可以,就是速度太慢了。

可能会遇到一些问题:

偶尔死活烧录不进去,具体未知,可以用串口调试助手:
/d进入调试模式/gi获取id/r退出调试,来回折腾几下,或者拔掉地线再接回去,就又可以了。

演示: https://www.bilibili.com/video/BV1K94y1Q7iS

atmega328接线:

参见atmega328文件夹里面的接线图。

其中晶振我是没按数据手册那样接电容电阻的,接上反而有问题,有点谜。UNO的2号接芯片的1脚;3号是编程模式会输出8M的pwm信号,退出编程模式则会关闭pwm信号输出,用来给芯片提供外置时钟,防止时钟熔丝设置错误导致芯片无法编程;uno的11,12,13就是spi的接线接芯片对应的引脚就行;芯片的电源跟地就跟uno的电源地接一起就可以了。

烧录atmega328:

1、接好线

2、cmd cd到当前目录 输入“make clean”清空之前的编译(可选)

3、输入“make TARGET_MCU_FILE=mcu_atmega328.cpp”编译

4、输入“make upload”上传到uno

5、输入“node main x\xxxx\xxxx.hex” 给atmega328烧录程序(支持hex跟bin文件,也可以烧录.eep(跟hex一样)到eeprom或者.eepb(跟bin一样)到eeprom),烧录eeprom不会清空flash,烧录flash根据熔丝位芯片会自动清空或者保留eeprom(详细见数据手册Fuse High Byte for ATmega328P)

设置atmega328熔丝位:

用串口调试助手,波特率设置250000,输入“/h”以回车换行(\r\n)结尾
可以看到详细的使用说明,大概详细吧-_-!!! 如:

/d 进入调试模式,mcu暂停,pc计数器指到0

/r 退出调试模式,mcu正常运行

/q 是开启或者关闭arduino串口输出,这样上位机可以直接跟atmega328串口通信

/sfl xx 设置低熔丝位,时钟源相关的就是在这里

....

演示: https://www.bilibili.com/video/BV1me4y1C7f6

About

用arduino uno给CC2541的蓝牙模块烧录程序的工具; A tool for arduino uno to program the cc2541 chip

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published