123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- /*
- * File: mcu_usart.c
- * Date: 26.05.2011
- * Denis Zheleznjakov @ ZiBlog.ru
- */
- #include "main.h"
- struct
- {
- volatile uint8_t rx_buffer[USART_RX_BUFFER_SIZE];
- volatile uint8_t rx_buffer_head;
- volatile uint8_t rx_buffer_tail;
- volatile uint8_t tx_buffer[USART_TX_BUFFER_SIZE];
- volatile uint8_t tx_buffer_head;
- volatile uint8_t tx_buffer_tail;
- } usart_fifo;
- void mcu_usart_init(uint32_t baud_rate)
- {
- usart_fifo.rx_buffer_head = 0;
- usart_fifo.rx_buffer_tail = 0;
- usart_fifo.tx_buffer_head = 0;
- usart_fifo.tx_buffer_tail = 0;
- CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
- USART_DeInit(USART1);
- USART_Init(USART1, baud_rate, USART_WordLength_8b, USART_StopBits_2, USART_Parity_No, (USART_Mode_TypeDef) (USART_Mode_Tx | USART_Mode_Rx));
- USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
- USART_Cmd(USART1, ENABLE);
- }
- _Bool mcu_usart_fifo_receive(uint8_t * data)
- {
- uint8_t rx_head;
- uint8_t rx_tail;
- rx_head = usart_fifo.rx_buffer_head;
- if (rx_head == usart_fifo.rx_buffer_tail)
- return FALSE;
- rx_tail = (uint8_t) ((usart_fifo.rx_buffer_tail + 1) & (uint8_t) (USART_RX_BUFFER_SIZE - 1));
- usart_fifo.rx_buffer_tail = rx_tail;
- *data = usart_fifo.rx_buffer[rx_tail];
- return TRUE;
- }
- void mcu_usart_fifo_transmit(uint8_t data)
- {
- uint8_t tx_head;
- tx_head = (uint8_t) ((usart_fifo.tx_buffer_head + 1) & (uint8_t) (USART_TX_BUFFER_SIZE - 1));
- while (tx_head == usart_fifo.tx_buffer_tail)
- {
- }
- usart_fifo.tx_buffer[tx_head] = data;
- usart_fifo.tx_buffer_head = tx_head;
- USART1->CR2 |= USART_CR2_TIEN;
- //USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
- }
- void mcu_usart_fifo_tx_handler(void)
- {
- uint8_t status;
- uint8_t tx_tail;
- uint8_t tx_head;
- status = USART1->SR;
- if (status & USART_SR_TC)
- {
- USART1->SR &= (uint8_t) (~USART_SR_TC);
- }
- if (status & USART_SR_TXE)
- {
- tx_head = usart_fifo.tx_buffer_head;
- tx_tail = usart_fifo.tx_buffer_tail;
- if (tx_head != tx_tail++)
- {
- tx_tail &= USART_TX_BUFFER_SIZE - 1;
- usart_fifo.tx_buffer_tail = tx_tail;
- USART1->DR = usart_fifo.tx_buffer[tx_tail];
- }
- else
- {
- USART1->CR2 &= (uint8_t) (~USART_CR2_TIEN);
- }
- }
- }
- void mcu_usart_fifo_rx_handler(void)
- {
- uint8_t rx_data;
- uint8_t rx_head;
- (void) USART1->SR;
- rx_data = USART1->DR;
- rx_head = (uint8_t) ((usart_fifo.rx_buffer_head + 1) & (uint8_t) (USART_RX_BUFFER_SIZE - 1));
- if (rx_head != usart_fifo.rx_buffer_tail)
- {
- usart_fifo.rx_buffer_head = rx_head;
- usart_fifo.rx_buffer[rx_head] = rx_data;
- }
- }
|