22 #include "stm32l1xx_hal.h" 24 static void init_rcc_usart2(
void)
29 static void init_rcc_usart4(
void)
34 static void init_gpio_usart2(
void)
36 GPIO_InitTypeDef GPIO_InitStruct;
38 __USART2_CLK_ENABLE();
40 GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
41 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
42 GPIO_InitStruct.Pull = GPIO_PULLUP;
43 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
44 GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
45 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
48 static void init_gpio_usart4(
void)
50 GPIO_InitTypeDef GPIO_InitStruct;
52 __USART4_CLK_ENABLE();
54 GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
55 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
56 GPIO_InitStruct.Pull = GPIO_PULLUP;
57 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
58 GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
59 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
62 #define MAXBUFSIZE 256 64 typedef struct st_usart_data {
66 unsigned char rbuf[MAXBUFSIZE];
68 unsigned char tbuf[2];
73 UART_HandleTypeDef huart;
79 static st_usart_data usart_data[3];
81 static void init_usart(st_usart_data *usart_dt, USART_TypeDef *usart,
int irq)
83 UART_HandleTypeDef *huart = &(usart_dt->huart);
85 huart->Instance = usart;
86 huart->Init.BaudRate = 115200;
87 huart->Init.WordLength = UART_WORDLENGTH_8B;
88 huart->Init.StopBits = UART_STOPBITS_1;
89 huart->Init.Parity = UART_PARITY_NONE;
90 huart->Init.Mode = UART_MODE_TX_RX;
91 huart->Init.HwFlowCtl = UART_HWCONTROL_NONE;
92 huart->Init.OverSampling = UART_OVERSAMPLING_16;
95 HAL_NVIC_EnableIRQ(irq);
96 __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
99 void inthdr_usart(
unsigned int intnum,
void *sp)
102 st_usart_data *usart_dt;
103 UART_HandleTypeDef *huart;
104 USART_TypeDef *usart;
107 if(intnum == IRQ2VECT(USART2_IRQn)) {
108 usart_dt = &usart_data[0];
109 }
else if(intnum == IRQ2VECT(UART4_IRQn)) {
110 usart_dt = &usart_data[1];
114 huart = &(usart_dt->huart);
115 usart = huart->Instance;
117 if(usart->SR & USART_SR_RXNE) {
118 usart->SR &= ~(USART_SR_RXNE);
120 if(
write_fifo(&(usart_dt->rfifo), &rd, 1) != 0) {
125 if(usart_dt == &usart_data[1]) {
132 if(usart->SR & USART_SR_PE) {
133 usart->SR &= ~(USART_SR_PE);
137 if(usart->SR & USART_SR_FE) {
138 usart->SR &= ~(USART_SR_FE);
142 if(usart->SR & USART_SR_NE) {
143 usart->SR &= ~(USART_SR_NE);
147 if(usart->SR & USART_SR_ORE) {
148 usart->SR &= ~(USART_SR_ORE);
152 if(usart->SR & USART_SR_TXE) {
153 usart->CR1 &= ~(USART_CR1_TXEIE);
158 const static char usart_rx_eventqueue_name[2][10] = {
159 "usart2_rx",
"usart4_rx" 162 const static char usart_tx_eventqueue_name[2][10] = {
163 "usart2_tx",
"usart4_tx" 171 static int usart_init(
struct st_device *dev,
char *param)
175 init_fifo(&(usart_data->rfifo), usart_data->rbuf, MAXBUFSIZE);
177 if(dev == &usart2_device) {
179 usart_rx_eventqueue_name[0], 0, 0, 0);
181 usart_tx_eventqueue_name[0],
182 usart_data->tbuf,
sizeof(
unsigned char), 2);
183 NVIC_SetPriority(USART2_IRQn, 0);
184 register_interrupt(IRQ2VECT(USART2_IRQn), inthdr_usart);
188 init_usart(usart_data, USART2, USART2_IRQn);
189 }
else if(dev == &usart4_device) {
191 usart_rx_eventqueue_name[1], 0, 0, 0);
193 usart_tx_eventqueue_name[1],
194 usart_data->tbuf,
sizeof(
unsigned char), 2);
195 NVIC_SetPriority(UART4_IRQn, 0);
196 register_interrupt(IRQ2VECT(UART4_IRQn), inthdr_usart);
200 init_usart(usart_data, UART4, UART4_IRQn);
211 static int usart_getc(
struct st_device *dev,
unsigned char *rd)
216 #define USART_TC_TIMEOUT 100000 217 #define USART_TE_TIMEOUT 1000 223 static int usart_putc(
struct st_device *dev,
unsigned char td)
225 int timeout = USART_TC_TIMEOUT;
226 USART_TypeDef *usart = ((st_usart_data *)(dev->
private_data))->huart.Instance;
228 while(!(usart->SR & USART_SR_TC)) {
231 SYSERR_PRINT(
"USART TC timeout\n");
238 usart->CR1 |= USART_CR1_TXEIE;
241 if(USART_TE_TIMEOUT != 0) {
242 SYSERR_PRINT(
"USART TXE timeout\n");
250 static int usart_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
252 UART_HandleTypeDef *huart = &(((st_usart_data *)(dev->
private_data))->huart);
256 HAL_UART_DeInit(huart);
257 huart->Init.BaudRate = arg;
258 HAL_UART_Init(huart);
262 SYSERR_PRINT(
"Unknown ioctl(%08lX)\n", com);
270 static int usart_select(
struct st_device *dev,
unsigned int timeout)
285 static UART_HandleTypeDef huart_low;
290 static int usart_init_low(
struct st_device *dev,
char *param)
295 huart_low.Instance = USART2;
296 huart_low.Init.BaudRate = 115200;
297 huart_low.Init.WordLength = UART_WORDLENGTH_8B;
298 huart_low.Init.StopBits = UART_STOPBITS_1;
299 huart_low.Init.Parity = UART_PARITY_NONE;
300 huart_low.Init.Mode = UART_MODE_TX_RX;
301 huart_low.Init.HwFlowCtl = UART_HWCONTROL_NONE;
302 huart_low.Init.OverSampling = UART_OVERSAMPLING_16;
303 HAL_UART_Init(&huart_low);
311 static int usart_getc_low(
struct st_device *dev,
unsigned char *rd)
313 USART_TypeDef *usart = huart_low.Instance;
315 if(usart->SR & USART_SR_RXNE) {
316 usart->SR &= ~(USART_SR_RXNE);
327 static int usart_putc_low(
struct st_device *dev,
unsigned char td)
329 int timeout = USART_TC_TIMEOUT;
330 USART_TypeDef *usart = huart_low.Instance;
332 while(!(usart->SR & USART_SR_TC)) {
345 .explan =
"STM32L1 USART2",
346 .private_data = (
void *)&usart_data[0],
347 .register_dev = usart_init,
350 .ioctl = usart_ioctl,
351 .select = usart_select
356 .explan =
"STM32L1 USART4",
357 .private_data = (
void *)&usart_data[1],
358 .register_dev = usart_init,
361 .ioctl = usart_ioctl,
362 .select = usart_select
365 const struct st_device usart2_low_device = {
367 .explan =
"Debug/Error Console",
368 .private_data = (
void *)&usart_data[2],
369 .register_dev = usart_init_low,
370 .getc = usart_getc_low,
371 .putc = usart_putc_low
#define DEF_DEV_NAME_DEBUG
標準エラー出力用UARTデバイス名
int read_fifo(struct st_fifo *fp, unsigned char *data, unsigned int length)
fifoからデータを読み出す
void * private_data
ドライバ固有データポインタ
void eventqueue_register_ISR(struct st_event *evtque, const char *name, void *args, unsigned int arg_size, int arg_count)
イベントキューを登録する
#define DEF_DEV_NAME_UART
標準入出力用UARTデバイス名
void event_wakeup_ISR(void *sp, struct st_event *evtque, void *arg)
イベントキューにイベントを登録し、イベント待ちタスクを起動する
int tkprintf(const char *fmt,...)
非タスクコンテキスト実行用メッセージ出力
unsigned int fifo_size(struct st_fifo *fp)
fifoに書き込まれているデータのサイズを返す
int write_fifo(struct st_fifo *fp, unsigned char *data, unsigned int length)
fifoにデータを書き込む
#define IOCMD_UART_SPEED
通信速度設定 arg:設定する通信速度(bps)
void init_fifo(struct st_fifo *fp, unsigned char *buf, unsigned int size)
fifoを初期化する
char name[MAX_DEVNAMELRN]
デバイス名文字列
int event_wait(struct st_event *evtque, void *argp, unsigned int timeout)
タスクをイベント待ち状態にする