CCMRAM 为仅CPU可直接访问的内存,外设不能访问,因此像ADC、USB这些外设是不能使用的,CCMRAM的使用方法大概以下:html
取消勾选 Keil --> Options for Target XXX --> Linker --> Use Memory Layout from Target Dialog
,并自定义散列文件:web
; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* ;LR_IROM1 0x08000000 0x00080000 { ; load region size_region ;ER_IROM1 0x08000000 0x00080000 { ; load address = execution address LR_IROM1 0x08010000 0x00080000 { ; load region size_region ER_IROM1 0x08010000 0x00080000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x10000000 0x00010000 { .ANY (CCMRAM) } }
在程序中,直接使用:CCMRAM a[10]={0};
app
USART 单字节传输
svg
USART DMA 传输
函数
注意事项:post
比较好用,性能稳定的调试助手 sokit , 注意,发送数据时要选中链接。性能
UDP 包的大小就应该是 1492 - IP头(20) - UDP头(8) = 1464(BYTES) TCP 包的大小就应该是 1492 - IP头(20) - TCP头(20) = 1452(BYTES)
可是发送1400字节长度则没有问题。尝试着在lwipopts.h
或 opts.h
中,把IP分片配置 IP_FRAG
和IP_REASSEMBLY两个宏定义打开以使能IP分片,仍是不能够加密
USB虚拟串口,单字节传输。
须要注意更改设备描述符,本人在开发过程当中,遇到一个现象,ST官网提供得PC虚拟串口驱动,只能Win10使用,Win7上仅个别电脑可用,其它电脑出现黄色叹号,最终经过更改设备描述符后正常,以下面代码,将 bDeviceClass
从 0x00
改为 0x02
后正常。
/* USB Standard Device Descriptor */ __ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END = { 0x12, /*bLength */ USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/ 0x00, /*bcdUSB */ 0x02, // 0x00, /*bDeviceClass*/ 0x02, /*bDeviceClass*/ 0x00, /*bDeviceSubClass*/ 0x00, /*bDeviceProtocol*/ USB_OTG_MAX_EP0_SIZE, /*bMaxPacketSize*/ LOBYTE(USBD_VID), /*idVendor*/ HIBYTE(USBD_VID), /*idVendor*/ LOBYTE(USBD_PID), /*idVendor*/ HIBYTE(USBD_PID), /*idVendor*/ 0x00, /*bcdDevice rel. 2.00*/ 0x02, USBD_IDX_MFC_STR, /*Index of manufacturer string*/ USBD_IDX_PRODUCT_STR, /*Index of product string*/ USBD_IDX_SERIAL_STR, /*Index of serial number string*/ USBD_CFG_MAX_NUM /*bNumConfigurations*/ } ; /* USB_DeviceDescriptor */
在 ST 官网搜索 IAP,可找到以下 资源
###重要总结
IAP的升级,须要编写两个程序,一个是bootloader程序,用于启动和升级系统,这里称为IAP程序;另外一个是Application应用程序,是你实际要运行的程序,这里称为APP程序。
流程大概是这样:上电后,先启动IAP程序,在IAP程序中判断是否升级标志,如果,则接收更新文件,而后进行校验无误后,写入APP地址区域(FLASH中),而后更改升级标志为否,跳转到APP执行;若否,则直接跳转到APP程序区域执行;在APP程序运行中,也能够根据接收的命令,判断是否进行升级,若升级,更改升级标志,并跳转到IAP程序。
须要注意的是,在跳转前(IAP --> APP,APP --> IAP)必须关闭全部使用的外设和中断,如网口、USB虚拟串口、ADC、DAC等等,防止升级过程当中外部中断触发致使升级失败。不然,当在另外一程序中开启中断时,MCU会处理以前触发的中断。ARM MDK中提供了以下两个接口来禁用(__disable_irq()
)和开启(__enable_irq()
)总中断。但使用时需注意:
__disable_irq()
只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,中断发生后,相应的寄存器会将中断标志置位,在__enable_irq()
开启中断后,因为相应的中断标志没有清空,于是还会触发中断。因此要想禁止全部中断,必须对逐个模块的中断进行Disable操做,因为每一个模块中断源有不少,对逐个中断Disable的话比较复杂,较为简单的方法是经过XXX_ClearITPendingBit()
清除中断标志或者直接经过XXX_DeInit()
来清除寄存器的状态。这样在__enable_irq()
开启总中断后,MCU就不会响应以前触发的中断了。
在作IAP升级开发时,能够先实现IAP到APP的跳转功能,此时,对于IAP和APP分别须要进行如下设置:
首先分配FLASH的内存,大小和地址任意,但不能重叠:
JumpToAPP()
跳转程序;Keil --> Options for Target XXX --> Target --> IROM1
如 0x8010000
,并确保Keil --> Options for Target XXX --> Linker --> Use Memory Layout from Target Dialog
勾选,若是不勾选,须要本身定义散列文件(Scatter File .sct),并在散列文件中设置;NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x10000);
;__enable_irq();
而后,分别下载两个程序到板子便可。
这里的Output目录与下面的目录一致
接上JTAG,串口发数正常,拔掉串口发数异常,帧与帧之间会多好些 FF
,网上有不少说法,有种说法是把JTAG与板子断开,而不是只拔USB。
一次烧写程序,错将CPU上的JTAG几个引脚中的一个引脚配成其它的引脚,致使下载时提示,不能与CPU链接,因而断电重试n次,问题依旧。后来灵机一动,在点下载程序按钮的同时上电,而不是在下载程序前上电,成功!!!
若是在汇编代码中使用C语言注释, Keil中编译会提示不少错误, 相似以下:
..\..\Libraries\RADAR_LIB\dsp\TransformFunctions\app_bitreversal2.S(43): error: A1163E: Unknown opcode defined(__CC_ARM) , expecting opcode or Macro error: A1137E: Unexpected characters at end of line ..\..\Libraries\RADAR_LIB\dsp\TransformFunctions\app_bitreversal2.S(70): error: A1167E: Invalid line start
参考 这里 解决, 即在Keil的汇编编译选项 (Options for Target … --> Asm --> Misc Controls) 中加入 --cpreproc
过滤, 便可.