il-2 (13.10.2015 15:57, просмотров: 805) ответил Constantin24 на Вообщем неясная проблема.
Все по разу по этим граблям прохаживались. А вот индусские программисты, писавшие USB-библиотеку STM32F0x2_USB-FS-Device_Lib V1.0.0, на эти грабли от души наступили, но удар по лбу пришелся таким парням как я :-). Цитата из ихней библиотеки, файл usb_core.c :
/**
* @brief Copy a buffer from user memory area to packet memory area (PMA)
* @param pbUsrBuf = pointer to user memory area.
* @param wPMABufAddr: address into PMA.
* @param wNBytes: no. of bytes to be copied.
* @retval None
*/
void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
{
uint32_t n = (wNBytes + 1) >> 1;
uint32_t i;
uint16_t *pdwVal;
pdwVal = (uint16_t *)(wPMABufAddr + PMAAddr);
for (i = n; i != 0; i--)
{
*(uint16_t*)pbUsrBuf++ = *pdwVal++;
pbUsrBuf++;
}
}
Из-за преобразования указателя pbUsrBuf генерируется инструкция STRH - которая в Cortex-M0 приводит к HardFault при обращении к нечетным адресам.