ad0x0_usart.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "main.h"
  2. #include "ad0x0_usart.h"
  3. #include <string.h>
  4. //#include "stm8s_delay.h"
  5. //#define ADQ_USART_TX_ENABLE USART1->CR1|= (USART_CR1_TE | USART_CR1_TCIE);
  6. //#define ADQ_USART_EV_ENABLE I2C2->CR2 |= (I2C_CR2_ITEVTEN|I2C_CR2_ITBUFEN);
  7. //void ad0x0_i2c_err_cb(void);
  8. //struct ad0x0_i2c_cmd_s ad0x0_i2c_fifo[AD0X0_FIFO_COUNT];
  9. //volatile struct ad0x0_i2c_cmd_s *ad0x0_pcurhwi=0,*ad0x0_pcurswi=0;
  10. volatile u8 ad0x0_usart_rbuf[16],ad0x0_usart_rbuf_count=0;
  11. volatile u8 ad0x0_usart_inint=0;
  12. volatile u8 *ad0x0_usart_pbuf_cur,*ad0x0_usart_pbuf=0,ad0x0_usart_pbuf_counter=0,txstr=0;
  13. bool ad0x0_usart_isReady(void){
  14. return (!ad0x0_usart_pbuf_counter) && (!txstr);
  15. }
  16. void ad0x0_usart_init(void){
  17. USART1->CR1=0;
  18. USART1->CR1|=USART_CR1_UE;
  19. USART1->CR1|= (USART_CR1_RE | USART_CR1_RXNEIE);// | USART_CR1_TXEIE);
  20. USART1->CR1|= (USART_CR1_TE | USART_CR1_TCIE);
  21. memset((void*)ad0x0_usart_rbuf,0,ad0x0_usart_rbuf_count);
  22. }
  23. void ad0x0_usart_txbuf(void *pbuf,int8_t bytes_count){
  24. if(!ad0x0_usart_isReady()){
  25. __asm("nop");
  26. }
  27. ad0x0_usart_pbuf=pbuf;
  28. ad0x0_usart_pbuf_cur=ad0x0_usart_pbuf;
  29. if(bytes_count>0)ad0x0_usart_pbuf_counter=bytes_count;else txstr=1;
  30. USART1->DR = *ad0x0_usart_pbuf_cur++;ad0x0_usart_pbuf_counter--;
  31. }
  32. void ad0x0_usart_txstr(u8 *pstr){
  33. if(!ad0x0_usart_isReady()){
  34. __asm("nop");
  35. }
  36. ad0x0_usart_pbuf_cur=pstr;
  37. txstr=1;
  38. USART1->DR = *ad0x0_usart_pbuf_cur;
  39. if(!(*ad0x0_usart_pbuf_cur))txstr=0;
  40. }
  41. void ad0x0_usart_irq(void){
  42. u32 sr=USART1->SR;
  43. if(sr & USART_SR_RXNE){//получили
  44. //USART1->CR1|= (USART_CR1_TXEIE|USART_CR1_TCIE|USART_CR1_TE);
  45. uint8_t d = USART1->DR; //
  46. ad0x0_usart_rbuf[ad0x0_usart_rbuf_count++]=d;
  47. if(ad0x0_usart_rbuf_count==16)ad0x0_usart_rbuf_count=0;
  48. USART1->DR = d; //
  49. }
  50. if(sr & (USART_SR_TC)){//отправили
  51. __asm("nop");
  52. if(ad0x0_usart_pbuf_counter){
  53. USART1->DR = *ad0x0_usart_pbuf_cur++;ad0x0_usart_pbuf_counter--;
  54. }
  55. if(txstr){
  56. if(*ad0x0_usart_pbuf_cur){
  57. ad0x0_usart_pbuf_cur++;
  58. }else txstr=0;
  59. USART1->DR = *ad0x0_usart_pbuf_cur;
  60. }
  61. USART1->SR&= ~USART_SR_TC;
  62. }
  63. }