19 #include "sysconfig.h" 28 #include "stm32f4xx_hal.h" 30 #ifdef GSC_TARGET_SYSTEM_NUCLEO_F411RE // $gsc ターゲットシステムはNUCLEO_F411RE 31 static void init_rcc_usart2(
void)
36 static void init_gpio_usart2(
void)
38 GPIO_InitTypeDef GPIO_InitStruct;
40 __USART2_CLK_ENABLE();
42 GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
43 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
44 GPIO_InitStruct.Pull = GPIO_PULLUP;
45 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
46 GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
47 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
53 #ifdef GSC_TARGET_SYSTEM_32F469IDISCOVERY // $gsc ターゲットシステムは32F469IDISCOVERY 54 static void init_rcc_usart3(
void)
59 static void init_gpio_usart3(
void)
61 GPIO_InitTypeDef GPIO_InitStruct;
63 __USART3_CLK_ENABLE();
65 GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
66 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
67 GPIO_InitStruct.Pull = GPIO_PULLUP;
68 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
69 GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
70 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
76 static void init_rcc_usart6(
void)
81 static void init_gpio_usart6(
void)
83 GPIO_InitTypeDef GPIO_InitStruct;
85 __USART6_CLK_ENABLE();
87 GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
88 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
89 GPIO_InitStruct.Pull = GPIO_PULLUP;
90 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
91 GPIO_InitStruct.Alternate = GPIO_AF8_USART6;
92 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
95 #define MAXBUFSIZE 256 97 typedef struct st_usart_data {
99 unsigned char rbuf[MAXBUFSIZE];
101 unsigned char tbuf[2];
106 UART_HandleTypeDef huart;
111 static st_usart_data usart_data[3];
113 static void init_usart(st_usart_data *usart_dt, USART_TypeDef *usart,
int irq)
115 UART_HandleTypeDef *huart = &(usart_dt->huart);
117 huart->Instance = usart;
118 huart->Init.BaudRate = 115200;
119 huart->Init.WordLength = UART_WORDLENGTH_8B;
120 huart->Init.StopBits = UART_STOPBITS_1;
121 huart->Init.Parity = UART_PARITY_NONE;
122 huart->Init.Mode = UART_MODE_TX_RX;
123 huart->Init.HwFlowCtl = UART_HWCONTROL_NONE;
124 huart->Init.OverSampling = UART_OVERSAMPLING_16;
125 HAL_UART_Init(huart);
127 HAL_NVIC_EnableIRQ(irq);
128 __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
131 void inthdr_usart(
unsigned int intnum,
void *sp)
134 st_usart_data *usart_dt;
135 UART_HandleTypeDef *huart;
136 USART_TypeDef *usart;
139 #ifdef GSC_TARGET_SYSTEM_NUCLEO_F411RE 140 if(intnum == IRQ2VECT(USART2_IRQn)) {
141 usart_dt = &usart_data[0];
144 #ifdef GSC_TARGET_SYSTEM_32F469IDISCOVERY 145 if(intnum == IRQ2VECT(USART3_IRQn)) {
146 usart_dt = &usart_data[0];
149 else if(intnum == IRQ2VECT(USART6_IRQn)) {
150 usart_dt = &usart_data[1];
154 huart = &(usart_dt->huart);
155 usart = huart->Instance;
157 if(usart->SR & USART_SR_RXNE) {
158 usart->SR &= ~(USART_SR_RXNE);
160 if(
write_fifo(&(usart_dt->rfifo), &rd, 1) != 0) {
165 if(usart_dt == &usart_data[1]) {
172 if(usart->SR & USART_SR_PE) {
173 usart->SR &= ~(USART_SR_PE);
177 if(usart->SR & USART_SR_FE) {
178 usart->SR &= ~(USART_SR_FE);
182 if(usart->SR & USART_SR_NE) {
183 usart->SR &= ~(USART_SR_NE);
187 if(usart->SR & USART_SR_ORE) {
188 usart->SR &= ~(USART_SR_ORE);
192 if(usart->SR & USART_SR_TXE) {
193 usart->CR1 &= ~(USART_CR1_TXEIE);
198 const static char usart_rx_eventqueue_name[2][10] = {
199 #ifdef GSC_TARGET_SYSTEM_NUCLEO_F411RE 202 #ifdef GSC_TARGET_SYSTEM_32F469IDISCOVERY 208 const static char usart_tx_eventqueue_name[2][10] = {
209 #ifdef GSC_TARGET_SYSTEM_NUCLEO_F411RE 212 #ifdef GSC_TARGET_SYSTEM_32F469IDISCOVERY 223 static int usart_init(
struct st_device *dev,
char *param)
227 init_fifo(&(usart_data->rfifo), usart_data->rbuf, MAXBUFSIZE);
229 #ifdef GSC_TARGET_SYSTEM_NUCLEO_F411RE 230 if(dev == &usart2_device) {
232 usart_rx_eventqueue_name[0], 0, 0, 0);
234 usart_tx_eventqueue_name[0],
235 usart_data->tbuf,
sizeof(
unsigned char), 2);
236 register_interrupt(IRQ2VECT(USART2_IRQn), inthdr_usart);
240 init_usart(usart_data, USART2, USART2_IRQn);
243 #ifdef GSC_TARGET_SYSTEM_32F469IDISCOVERY 244 if(dev == &usart3_device) {
246 usart_rx_eventqueue_name[0], 0, 0, 0);
248 usart_tx_eventqueue_name[0],
249 usart_data->tbuf,
sizeof(
unsigned char), 2);
250 register_interrupt(IRQ2VECT(USART3_IRQn), inthdr_usart);
254 init_usart(usart_data, USART3, USART3_IRQn);
257 else if(dev == &usart6_device) {
259 usart_rx_eventqueue_name[1], 0, 0, 0);
261 usart_tx_eventqueue_name[1],
262 usart_data->tbuf,
sizeof(
unsigned char), 2);
263 register_interrupt(IRQ2VECT(USART6_IRQn), inthdr_usart);
267 init_usart(usart_data, USART6, USART6_IRQn);
278 static int usart_getc(
struct st_device *dev,
unsigned char *rd)
283 #define USART_TC_TIMEOUT 100000 284 #define USART_TE_TIMEOUT 1000 290 static int usart_putc(
struct st_device *dev,
unsigned char td)
292 int timeout = USART_TC_TIMEOUT;
293 USART_TypeDef *usart = ((st_usart_data *)(dev->
private_data))->huart.Instance;
295 while(!(usart->SR & USART_SR_TC)) {
298 SYSERR_PRINT(
"USART TC timeout\n");
305 usart->CR1 |= USART_CR1_TXEIE;
308 if(USART_TE_TIMEOUT != 0) {
309 SYSERR_PRINT(
"USART TXE timeout\n");
317 static int usart_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
319 UART_HandleTypeDef *huart = &(((st_usart_data *)(dev->
private_data))->huart);
323 HAL_UART_DeInit(huart);
324 huart->Init.BaudRate = arg;
325 HAL_UART_Init(huart);
329 SYSERR_PRINT(
"Unknown ioctl(%08lX)\n", com);
337 static int usart_select(
struct st_device *dev,
unsigned int timeout)
354 static UART_HandleTypeDef huart_low;
359 static int usart_init_low(
struct st_device *dev,
char *param)
361 #ifdef GSC_TARGET_SYSTEM_NUCLEO_F411RE 364 huart_low.Instance = USART2;
366 #ifdef GSC_TARGET_SYSTEM_32F469IDISCOVERY 369 huart_low.Instance = USART3;
372 huart_low.Init.BaudRate = 115200;
373 huart_low.Init.WordLength = UART_WORDLENGTH_8B;
374 huart_low.Init.StopBits = UART_STOPBITS_1;
375 huart_low.Init.Parity = UART_PARITY_NONE;
376 huart_low.Init.Mode = UART_MODE_TX_RX;
377 huart_low.Init.HwFlowCtl = UART_HWCONTROL_NONE;
378 huart_low.Init.OverSampling = UART_OVERSAMPLING_16;
379 HAL_UART_Init(&huart_low);
387 static int usart_getc_low(
struct st_device *dev,
unsigned char *rd)
389 USART_TypeDef *usart = huart_low.Instance;
391 if(usart->SR & USART_SR_RXNE) {
392 usart->SR &= ~(USART_SR_RXNE);
403 static int usart_putc_low(
struct st_device *dev,
unsigned char td)
405 int timeout = USART_TC_TIMEOUT;
406 USART_TypeDef *usart = huart_low.Instance;
408 while(!(usart->SR & USART_SR_TC)) {
419 #ifdef GSC_TARGET_SYSTEM_NUCLEO_F411RE 422 .explan =
"STM32F4 USART2",
423 .private_data = (
void *)&usart_data[0],
424 .register_dev = usart_init,
427 .ioctl = usart_ioctl,
428 .select = usart_select
431 const struct st_device usart2_low_device = {
433 .explan =
"Debug/Error Console",
434 .private_data = (
void *)&usart_data[2],
435 .register_dev = usart_init_low,
436 .getc = usart_getc_low,
437 .putc = usart_putc_low
440 #ifdef GSC_TARGET_SYSTEM_32F469IDISCOVERY 443 .explan =
"STM32F4 USART3",
444 .private_data = (
void *)&usart_data[0],
445 .register_dev = usart_init,
448 .ioctl = usart_ioctl,
449 .select = usart_select
452 const struct st_device usart3_low_device = {
454 .explan =
"Debug/Error Console",
455 .private_data = (
void *)&usart_data[2],
456 .register_dev = usart_init_low,
457 .getc = usart_getc_low,
458 .putc = usart_putc_low
464 .explan =
"STM32F4 USART6",
465 .private_data = (
void *)&usart_data[1],
466 .register_dev = usart_init,
469 .ioctl = usart_ioctl,
470 .select = usart_select
#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)
タスクをイベント待ち状態にする