2015年1月10日土曜日

STM32F4 でシリアル通信(割込みあり)

前回に引き続き、STM32F4 discoveryのUART2を使って、パソコンにメッセージを表示させてみた。
今回は割込み使用。

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.remainSR & 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 件のコメント:

コメントを投稿