支持UCOS,FREERTOS,RT Thread。根据查询stm32f767相关资料得知,支持UCOS,FREERTOS,RT Thread这三款嵌入式系统,避免了系统在无人干预时长时间挂起的情况,具有良好的硬件平台独立性。
mixly编写stm32单片机 :Mixly是一款面向初学者、硬件编程爱好者的图形化编程软件,支持20CoreBoard_STM32单片机的图形化编程,支持STM32F1、Arduino、ESP32、ESP8266、MicroPython、Python等语言的图形化编程。提供了图形化界面和代码界面对比显示的支持。
原子大哥在哪里?呵呵
这个简单,下载个STM32F767的CUBE库,里面有现存的SPI工程,测试下。
做些比较,看看哪里配置有问题。当然硬件连接不能有问题。
你可以SPI自发自收,先排除硬件方面的问题。
是可以的,但是要注意一些细节,比如STM32MicroPython使用的是Python语言,而C语言使用的是C语言,两者之间有很大的差异。因此,在混写时需要注意这些差异,以免出现问题。
STM32用CubeMX创建SDIO+FatFs,f_Open失败。
如题,具体环境是CubeMX最新版,HAL库最新版,MDK5.24a,STLINKv2-1,板子是STM32F407Vet6核心板(某宝四五十块钱)。
SDIO单独测试TF卡(4G卡肯定不是正版)成功,可以读出CSD,CID,卡的状态,卡的容量等,SDIO四线无DMA读写正常。
本人前前后后试过无数次,好几个月,现在不得不弄好!感谢大佬的帮助!
CubeMX:SDIO四线,无DMA,无SDIO全局中断,勾选FatFS文件系统,文件系统加入长名STACK,单片机HEAP-0x800,STACK-0x1000。
具体代码:
主程序:
/* USER CODE BEGIN PV */。
/* Private variables ---------------------------------------------------------*/。
FRESULT res; /* FatFs function common retSDult code */。
uint32_t byteswritten, bytesread; /* File write/read counts */。
uint8_t wtext[] = "This is STM32 working with FatFs"; /* File write buffer */。
uint8_t rtext[100]; /* File read buffer */。
/* USER CODE END PV */。
int main(void)
/* USER CODE BEGIN 1 */。
/* USER CODE END 1 */。
/* MCU Configuration----------------------------------------------------------*/。
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */。
HAL_Init();
/* USER CODE BEGIN Init */。
/* USER CODE END Init */。
/* Configure the system clock */。
SystemClock_Config();。
/* USER CODE BEGIN SysInit */。
/* USER CODE END SysInit */。
/* Initialize all configured peripherals */。
MX_GPIO_Init();。
MX_SDIO_SD_Init();。
MX_USART2_UART_Init();。
MX_FATFS_Init();。
/* USER CODE BEGIN 2 */。
****************************************************。
从HAL库中F4Disco里抄来的代码。
****************************************************。
if(f_mount(&SDFatFS, (TCHAR const*)SDPath, 0) != FR_OK)。
{
/* FatFs Initialization Error */。
Error_Handler();。
}
else
{
/* Create and Open a new text file object with write access */。
if(f_open(&SDFile, "STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE) != FR_OK)。
{
/* 'STM32.TXT' file Open for write Error */。
Error_Handler();。
}
else
{
/* Write data to the text file */。
res = f_write(&SDFile, wtext, sizeof(wtext), (void *)&byteswritten);。
if((byteswritten == 0) || (retSD != FR_OK))。
{
/* 'STM32.TXT' file Write or EOF Error */。
Error_Handler();。
}
else
{
/* Close the open text file */。
f_close(&SDFile);。
/* Open the text file object with read access */。
if(f_open(&SDFile, "STM32.TXT", FA_READ) != FR_OK)。
{
/* 'STM32.TXT' file Open for read Error */。
Error_Handler();。
}
else
{
/* Read data from the text file */。
res = f_read(&SDFile, rtext, sizeof(rtext), (void *)&bytesread);。
if((bytesread == 0) || (retSD != FR_OK))。
{
/* 'STM32.TXT' file Read or EOF Error */。
Error_Handler();。
}
else
{
/* Close the open text file */。
f_close(&SDFile);。
/* Compare read data with the expected data */。
if((bytesread != byteswritten))。
{ 。
/* Read data is different from the expected data */。
Error_Handler();。
}
else。
{
/* Success of the demo: no error occurrence */。
HAL_GPIO_WritePin(GPIOA, D2_Pin|D3_Pin, GPIO_PIN_SET);。
}
}
}
}
}
}
/* Unlink the USB disk I/O driver */。
FATFS_UnLinkDriver(SDPath); 。
/* USER CODE END 2 */。
/* Infinite loop */。
/* USER CODE BEGIN WHILE */。
while (1)
{
/* USER CODE END WHILE */。
/* USER CODE BEGIN 3 */。
}
/* USER CODE END 3 */。
****************************************************。
单步调试结果 Sd_diskio.c中死循环。
****************************************************。
DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)。
DRESULT res = RES_ERROR;。
ReadStatus = 0;。
uint32_t timeout;。
#if (ENABLE_SD_DMA_CACHE_MAINTENANCE == 1)。
uint32_t alignedAddr;。
#endif
if(BSP_SD_ReadBlocks_DMA((uint32_t*)buff,。
(uint32_t) (sector),。
count) == MSD_OK)。
{
/* Wait that the reading process is completed or a timeout occurs */。
timeout = HAL_GetTick();。
while((ReadStatus == 0) && ((HAL_GetTick() - timeout) < SD_TIMEOUT))//在此处无限循环。
{
}
/* incase of a timeout return error */。
if (ReadStatus == 0)。
{
res = RES_ERROR;。
}
else
{
ReadStatus = 0;。
timeout = HAL_GetTick();。
while((HAL_GetTick() - timeout) < SD_TIMEOUT)。
{
if (BSP_SD_GetCardState() == SD_TRANSFER_OK)。
{
res = RES_OK;。
#if (ENABLE_SD_DMA_CACHE_MAINTENANCE == 1)。
/*
the SCB_InvalidateDCache_by_Addr() requires a 32-Byte aligned address,。
adjust the address and the D-Cache size to invalidate accordingly.。
*/。
alignedAddr = (uint32_t)buff & ~0x1F;。
SCB_InvalidateDCache_by_Addr((uint32_t*)alignedAddr, count*BLOCKSIZE + ((uint3。