1:小板原理图分析
1:采用国产芯片AT32F415 封装采用TSSOP20
2:CAN收发器采用NXP tja1042/3
3: Flash采用Winbond公司 W25Q32JVSSIQ
4:一路用户开关
5: 三个led指示灯
6:采用TYPE C接口
7:输入电源经过TVS管保护后进入78M05(电压范围6-32V)
8:一个按钮开关
软件使用说明书:CAN 离线记录仪使用说明书-CSDN博客
2:芯片资料下载
2.1:网页登入官网https://www.arterytek.com/cn/product/AT32F415.jsp
下载清单如下
项目 | 文件名 | 备用 |
Datasheet | DS_AT32F415_V2.02_CH.pdf | 数据手册 |
Reference Manual | RM_AT32F415_CH_V2.03.pdf | 技术手册 |
BSP | AT32F415_Firmware_Library_V2.1.3.zip | 固件库 |
Pack | Keil5_AT32MCU_AddOn_V2.2.9.zip Segger_AT32MCU_AddOn_V2.0.9.zip | keil5编译下载仿真芯片 |
Tool | AT32_New_Clock_Configuration_V3.0.10.zip Artery_CAN_BitRate_Configuration_V1.0.01 | 需要的工具 |
解压BSP:
3:创建项目工程
项目根目录
SDK目录:拷贝AT32F415_Firmware_Library_V2.1.3目录下libraries middlewares
App 目录
Boot目录
添加工程相关文件:
使用到的外设:
1:定时器at32f425_tmr.c
2:SPI通信模块at32f425_spi.c
3:CAN通信模块at32f425_can.c
4:adc用户开关采样at32f425_adc.c
5:usb通信模块at32f425_usb.c
6:led指示灯at32f425_gpio.c
7:升级flash at32f425_flash.c
8:其他模块都是配送这些模块使用
4:理论数据分析
打开w25Q32JV数据手册 查看 AC Electrical Characteristics
1:通过上面数据Flash编程速度:Sector Erase Time(4K)45ms Page program Time(256 Byte) 0.4ms,通过上面参数可以得出编程4KFlash需要 45+0.4*16 = 51.4ms
2:SPI总线速率 = 48M 传输4K数据需要时间 约等于 0.68ms
综合所述 编程4K flash时间 52ms SPI FLASH编程速度 = 76.9K/S
从zlg .CAN 格式一帧数据为24字节 2000*24 = 48K/S 理论分析每秒保存2000帧没问题
typedef struct zlg_can
{
uint32_t id; //4byte;
uint32_t hardwareTimestamp; //0.1ms 硬件时间戳 小端模式
uint8_t SoftwareTimestampH; //软件时间戳 高两位 11-C 硬件时间 10-8 软件时间+硬
uint8_t rxtx_flag; //FF为接收 其他值成功
uint8_t frame_type; //0为数据帧,1为远程帧 bool
uint8_t id_type; //0为标准帧,1为扩展帧 bool
uint8_t dlc;
uint8_t data[8];
uint8_t SoftwareTimestampM2;
uint8_t SoftwareTimestampM1;
uint8_t SoftwareTimestampL;
}zlg_msg_can;
5:FATFS移植(文件系统移植)
1:到官网下载最新版本 http://elm-chan.org/fsw/ff/00index_e.html 我当前最新版本为 R0.15
需要修改的函数有:
DSTATUS disk_initialize (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
调用SPI_Flash.c spiflash_read_id() 返回Flash容量 w25q32 w25q64...
DRESULT disk_read (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
BYTE *buff, /* Data buffer to store read data */
LBA_t sector, /* Start sector in LBA */
UINT count /* Number of sectors to read */
)
调用SPI_Flash.c spiflash_read(buff, addr, length);
DRESULT disk_write (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
const BYTE *buff, /* Data to be written */
LBA_t sector, /* Start sector in LBA */
UINT count /* Number of sectors to write */
)
调用SPI_Flash.c spiflash_write(buff, addr, length);
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
返回flash扇区大小 512 字节 块大小为8扇区 总扇区数量为总容量除以512
如 w25q32 总扇区数量为 4M/512 = 8,192
读者肯定疑问:W25qxx数据手册明明写的扇区大小为4K,这里怎么成512字节了。其实扇区写4K也么啥关心,但是为了省ram资源。移植msc U盘是也要一致所以干脆都定义512字节
#define FF_MIN_SS 512
#define FF_MAX_SS 512 //如果用户需要4k 把这里改 4096 就可以。
6:FATFA测试
FATFS fs; /*Fs文件系统对象 */
FIL file; // file objects
void fatfs_tset(void)
{
uint32_t i;
BYTE work[FF_MAX_SS];
UINT bw;
static const MKFS_PARM defopt = {FM_FAT, 0, 0, 0, 1024};
uint8_t wtext[100] = "This is STM32 working\n"; /* File write buffer */
uint8_t rtext[100]; /* File read buffers */
char filename[] = "006.txt";
uint8_t res; /* Return value for SD */
res = f_mount(&fs, "", 1);
#if 1 //空盘会格式化
/*格式化文件系统*/
if(res!=FR_OK)
{
res = f_mkfs("0:", &defopt,work, sizeof work);
res = f_mount(&fs, "", 1);
}
#endif
res = f_open(&file, filename, FA_CREATE_ALWAYS | FA_WRITE);
res = f_write(&file, wtext, sizeof(wtext), &bw);
res = f_close(&file);
res = f_open(&file, filename, FA_READ);
res = f_read(&file, rtext, sizeof(rtext), &bw);
res = f_close(&file);
}
上面函数写数据与读数据一致代表移植成功。
7:AT32F415 时钟配置
1:在这个技术发展这么快的社会再通过人工去配置寄存器,那就太没啥意思了。我们借助官网提供的工具来配置 解压AT32_New_Clock_Configuration_V3.0.10.zip
把最终生成的数据拷贝到工程at32f425_clock.c 覆盖原来的函数。
1:由于是低成本的小模块,干脆用内部48M晶振。
2:芯片最高频率能跑到150M,其实也用不着,不要浪费能耗了。96M已经戳戳有余其实72M我觉得就够了。
7:CAN 模块移植与测试
其实对于开发者来说要充分利用官网的资源,尽量少写代码。我就跑到BSP 例程里找到CAN测试用例
把这个CAN初始化与发送函数拷贝到工程
自己工程内创建一个hal_can.c / hal_can.c 然后把官网函数拷贝过来。感觉这样会专业点~~
然后把初始化与发送丢到main函数里,用来测试CAN模块是否通。注意这部一定要有CAN节点与小板相连,自己有做个简单USB转CAN工具这部肯定难不到我。
如果没有通注意下CAN波特率基本问题不大。
8:USB hid与msc切换
这应该是这个项目最难的一步吧,但是没关系我们秉承能抄就不写的原则。
1:把这工程用到的文件拷贝到自己工程来
usbd_init(&otg_core_struct,
USB_FULL_SPEED_CORE_ID,
USB_ID,
&msc_class_handler,
&msc_desc_handler); //msc模式
usbd_init(&otg_core_struct,
USB_FULL_SPEED_CORE_ID,
USB_ID,
&hid_iap_class_handler,
&hid_iap_desc_handler); //hid 模式
1:main.c 分别加入这两个调用,电脑能出现一个模拟的u盘,或一个hid 输入设备,基本就完成信心倍增。
2:通过板上的开关来回切换usb模式,奇次为msc偶次为hid。恭喜你这个项目你已经扫清一切障碍了。