#include "ds2480_stm32f4_hal.h" #include #include 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; }