今回は割込み使用。
uart2_printf(送信文字列)は、割込みなしで送信。
sci2_printf(送信文字列)は、リングバッファ経由で割込みありで送信。
共に、全角文字は駄目かなと思っていたけれど、ターミナルソフトの文字コードをSJISにしたら、全角文字も送れた。
プロジェクトは、こちら(stm32f4_uart02.zip)に保管します。
ソースコードは以下。
#include#include #include #include "stm32f4xx.h" #include "uart.h" // --------------------------------------------------- // 割り込み使用ルーチン // --------------------------------------------------- #define BUFF_SIZE 64 typedef struct{ unsigned short remain; unsigned short rd_ptr; unsigned short wr_ptr; unsigned char buff[BUFF_SIZE]; }SCI_BUFF; static SCI_BUFF txd2; // 割込みルーチン void USART2_IRQHandler(void){ // 送信完了割り込み if(USART_GetITStatus(USART2,USART_IT_TXE) != RESET){ // 1文字送信(リードポインタを1増) USART_SendData(USART2,txd2.buff[txd2.rd_ptr++]); // 未送信データ数を1減 txd2.remain--; // リードポインタがバッファの最後まできたら、最初に戻す if(txd2.rd_ptr==BUFF_SIZE){ txd2.rd_ptr=0; } // 送信したデータが最後であれば、送信完了割込みの停止 if(txd2.rd_ptr==txd2.wr_ptr){ USART_ITConfig(USART2,USART_IT_TXE,DISABLE); } } } // usart2 で割込みを使う際の初期化 // : 関数名は変えたほうが良い void sci2_init(void){ txd2.remain=0; txd2.rd_ptr=0; txd2.wr_ptr=0; NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } char sci2_putchar(unsigned char data){ char txdata; txdata = -1; if(data>0){ // データバッファに空きがあれば処理する if(txd2.remain SR & 0x00000040)); //前回の送信が終わるまで待機 USART_SendData(USARTx,c); } void USART_puts(USART_TypeDef* USARTx,const char *str){ while(*str != '\0'){ if(*str=='\n'){ USART_putc(USARTx,0x0A); USART_putc(USARTx,0x0D); }else{ USART_putc(USARTx,*str); } str++; } return ; } void uart2_printf(const char *format, ...) { va_list list; va_start(list, format); int len = vsnprintf(0, 0, format, list); char *s; s = (char *)malloc(len + 1); vsprintf(s, format, list); USART_puts(USART2,s); free(s); va_end(list); return; }
0 件のコメント:
コメントを投稿