42 lines
2.2 KiB
C
42 lines
2.2 KiB
C
#include "ds2480_stm32f4_hal.h"
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
|
|
static uint32_t now, low_ms, high_ms, clears;
|
|
static GPIO_TypeDef gpio;
|
|
static unsigned fail_init, fail_tx;
|
|
void test_clear(UART_HandleTypeDef *u){u->Instance->SR=0;++clears;}
|
|
HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *u){(void)u;return HAL_OK;}
|
|
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *u)
|
|
{assert(gpio.mode==GPIO_MODE_AF_PP && gpio.level==1);assert(u->Init.BaudRate==9600);return fail_init?HAL_ERROR:HAL_OK;}
|
|
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *u,const uint8_t *p,uint16_t n,uint32_t timeout)
|
|
{assert(n==1 && timeout==20);u->Instance->DR=*p;u->Instance->SR=USART_SR_RXNE;return fail_tx?HAL_ERROR:HAL_OK;}
|
|
void HAL_GPIO_WritePin(GPIO_TypeDef *g,uint16_t pin,uint32_t level){g->pin=pin;g->level=level;}
|
|
void HAL_GPIO_Init(GPIO_TypeDef *g,const GPIO_InitTypeDef *i){assert(i->Pin==64);g->mode=i->Mode;}
|
|
void HAL_Delay(uint32_t ms){now+=ms;if(gpio.level)high_ms+=ms;else low_ms+=ms;}
|
|
uint32_t HAL_GetTick(void){return now++;}
|
|
|
|
int main(void)
|
|
{
|
|
USART_TypeDef regs={0};UART_HandleTypeDef uart={0};
|
|
ds2480_stm32f4_hal ctx={&uart,&gpio,64,8};ds2480_port port;
|
|
uint8_t byte=0xCD,rx=0;
|
|
uart.Instance=®s;
|
|
assert(ds2480_stm32f4_hal_bind(&ctx,&port)==DS2480_OK);
|
|
assert(port.prepare(port.user)==0 && low_ms>=2 && high_ms>=2 && clears==1);
|
|
assert(port.write(port.user,&byte,1,20)==0);
|
|
assert(regs.SR & USART_SR_RXNE); /* Early reply must survive TX completion. */
|
|
assert(port.read(port.user,&rx,1,20)==0 && rx==byte && clears==1);
|
|
regs.SR=USART_SR_RXNE|USART_SR_FE;rx=0xA5;
|
|
assert(port.read(port.user,&rx,1,20)!=0 && rx==0xA5 && clears==2);
|
|
regs.SR=USART_SR_ORE;assert(port.write(port.user,&byte,1,20)!=0);
|
|
regs.SR=0;now=UINT32_MAX-5;
|
|
assert(port.read(port.user,&rx,1,20)!=0); /* Wrap-safe bounded timeout. */
|
|
assert(port.write(port.user,&byte,2,20)!=0);
|
|
assert(port.read(port.user,&rx,1,HAL_MAX_DELAY)!=0);
|
|
fail_tx=1;assert(port.write(port.user,&byte,1,20)!=0);
|
|
fail_init=1;assert(port.prepare(port.user)!=0 && gpio.level==1);
|
|
ctx.tx_pin=3;assert(ds2480_stm32f4_hal_bind(&ctx,&port)==DS2480_ARGUMENT);
|
|
puts("STM32F4 UART port: OK");return 0;
|
|
}
|