TA的每日心情 | 无聊 2016-12-23 14:05 |
---|
签到天数: 7 天 连续签到: 1 天 [LV.3]偶尔看看II
|
1. 首先拿到板子,先跑了一下freertos系统。
函数简单介绍下:
// 定义一些线程的参数,优先级,堆栈之类的。
osThreadDef(THREAD_1, LED_Thread1, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);
// 创建线程
LEDThread1Handle = osThreadCreate(osThread(THREAD_1), NULL);
// 阻塞线程,这个函数很有用的,可以先记住。
osThreadSuspend(LEDThread1Handle);
// 系统开始
osKernelStart();
总的来说,ST肯定在freertos源码的基础上,他们封装了一层函数。所以名字变了,本来是task,现在称呼为thread。
2. 上面的不是关键,要说串口这个BUG。
这个路径的例程。
\en.stm32cubel4\STM32Cube_FW_L4_V1.5.0\Projects\STM32L476RG-Nucleo\Examples\UART\UART_TwoBoards_ComIT\Src
为什么说这个函数,我觉得这个函数有问题,或者是我用的不对。
if(HAL_UART_Receive_IT(&UartHandle, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
{
Error_Handler();
}
我理解是,串口接收指定长度的数据,数据接收满就会退出。但是实际测试效果不好。基本是乱码。
串口自发自收就是这个结果了。
3. 然后看了下函数原型。风格和我以前用的不一样,估计要好好研究了。我怀疑串口接收是在中断接收的,不是这个函数。
这个函数估计只是设置用的。
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
/* Check that a Rx process is not already ongoing */
if(huart->RxState == HAL_UART_STATE_READY)
{
if((pData == NULL ) || (Size == 0))
{
return HAL_ERROR;
}
/* Process Locked */
__HAL_LOCK(huart);
huart->pRxBuffPtr = pData;
huart->RxXferSize = Size;
huart->RxXferCount = Size;
/* Computation of UART mask to apply to RDR register */
UART_MASK_COMPUTATION(huart);
huart->ErrorCode = HAL_UART_ERROR_NONE;
huart->RxState = HAL_UART_STATE_BUSY_RX;
/* Process Unlocked */
__HAL_UNLOCK(huart);
/* Enable the UART Parity Error Interrupt */
SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);
/* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
SET_BIT(huart->Instance->CR3, USART_CR3_EIE);
/* Enable the UART Data Register not empty Interrupt */
SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE);
return HAL_OK;
}
else
{
return HAL_BUSY;
}
}
不过串口中断函数太复杂了,先不研究了。。void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
qhq
|
|