22 #include "sysconfig.h" 31 #include "stm32f7xx_hal.h" 32 #include "stm32f7xx_hal_uart.h" 33 #include "stm32f7xx_hal_uart_ex.h" 35 #if defined(GSC_TARGET_SYSTEM_STM32F769IDISCOVERY) 36 #define USART_TxPin GPIO_PIN_9 37 #define USART_RxPin GPIO_PIN_10 38 #define USART_TxPort GPIOA 39 #define USART_RxPort GPIOA 40 #elif defined(GSC_TARGET_SYSTEM_STM32F746GDISCOVERY) 41 #define USART_TxPin GPIO_PIN_9 42 #define USART_RxPin GPIO_PIN_7 43 #define USART_TxPort GPIOA 44 #define USART_RxPort GPIOB 47 static void init_rcc_uart1(
void)
49 __HAL_RCC_GPIOA_CLK_ENABLE();
50 #if defined(GSC_TARGET_SYSTEM_STM32F746GDISCOVERY) 51 __HAL_RCC_GPIOB_CLK_ENABLE();
55 static void init_rcc_uart6(
void)
57 __HAL_RCC_GPIOC_CLK_ENABLE();
60 static void init_gpio_uart1(
void)
62 GPIO_InitTypeDef GPIO_InitStruct;
64 __HAL_RCC_USART1_CLK_ENABLE();
66 GPIO_InitStruct.Pin = USART_TxPin;
67 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
68 GPIO_InitStruct.Pull = GPIO_PULLUP;
69 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
70 GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
71 HAL_GPIO_Init(USART_TxPort, &GPIO_InitStruct);
73 GPIO_InitStruct.Pin = USART_RxPin;
74 HAL_GPIO_Init(USART_RxPort, &GPIO_InitStruct);
77 HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
78 HAL_NVIC_EnableIRQ(USART1_IRQn);
81 static void init_gpio_uart6(
void)
83 GPIO_InitTypeDef GPIO_InitStruct;
85 __HAL_RCC_USART6_CLK_ENABLE();
87 GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
88 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
89 GPIO_InitStruct.Pull = GPIO_PULLUP;
90 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
91 GPIO_InitStruct.Alternate = GPIO_AF8_USART6;
92 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
95 HAL_NVIC_SetPriority(USART6_IRQn, 0, 0);
96 HAL_NVIC_EnableIRQ(USART6_IRQn);
99 #define MAXBUFSIZE 256 101 struct st_uart_data {
103 unsigned char rbuf[MAXBUFSIZE];
105 unsigned char tbuf[2];
110 UART_HandleTypeDef huart;
116 static struct st_uart_data uart_data[3];
118 static void init_uart(
struct st_uart_data *uart_dt, USART_TypeDef *uart,
int speed)
120 UART_HandleTypeDef *huart = &(uart_dt->huart);
122 huart->Instance = uart;
123 huart->Init.BaudRate = speed;
124 huart->Init.WordLength = UART_WORDLENGTH_8B;
125 huart->Init.StopBits = UART_STOPBITS_1;
126 huart->Init.Parity = UART_PARITY_NONE;
127 huart->Init.Mode = UART_MODE_TX_RX;
128 huart->Init.HwFlowCtl = UART_HWCONTROL_NONE;
129 huart->Init.OverSampling = UART_OVERSAMPLING_16;
130 huart->Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
131 huart->AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
132 if(HAL_UART_Init(huart) != HAL_OK) {
133 SYSERR_PRINT(
"HAL UART Init error.\n");
136 __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
139 void inthdr_uart(
unsigned int intnum,
void *sp)
142 struct st_uart_data *uart_dt;
143 UART_HandleTypeDef *huart;
147 if(intnum == IRQ2VECT(USART1_IRQn)) {
148 uart_dt = &uart_data[0];
149 }
else if(intnum == IRQ2VECT(USART6_IRQn)) {
150 uart_dt = &uart_data[1];
154 huart = &(uart_dt->huart);
155 uart = huart->Instance;
157 if(uart->ISR & USART_ISR_RXNE) {
158 uart->ICR = USART_ICR_ORECF | USART_ICR_NCF | USART_ICR_FECF | USART_ICR_PECF;
160 if(
write_fifo(&(uart_dt->rfifo), &rd, 1) == 0) {
165 if(uart_dt == &uart_data[1]) {
172 if(uart->ISR & USART_ISR_PE) {
173 uart->ISR &= ~(USART_ISR_PE);
177 if(uart->ISR & USART_ISR_FE) {
178 uart->ISR &= ~(USART_ISR_FE);
182 if(uart->ISR & USART_ISR_NE) {
183 uart->ISR &= ~(USART_ISR_NE);
187 if(uart->ISR & USART_ISR_ORE) {
188 uart->ISR &= ~(USART_ISR_ORE);
192 if(uart->ISR & USART_ISR_TXE) {
193 uart->CR1 &= ~(USART_CR1_TXEIE);
202 const static char uart_rx_eventqueue_name[2][10] = {
203 "uart1_rx",
"uart6_rx" 206 const static char uart_tx_eventqueue_name[2][10] = {
207 "uart1_tx",
"uart6_tx" 210 static int uart_init(
struct st_device *dev,
char *param)
214 init_fifo(&(uart_data->rfifo), uart_data->rbuf, MAXBUFSIZE);
216 if(dev == &uart1_device) {
218 uart_rx_eventqueue_name[0], 0, 0, 0);
220 uart_tx_eventqueue_name[0],
221 uart_data->tbuf,
sizeof(
unsigned char), 2);
222 register_interrupt(IRQ2VECT(USART1_IRQn), inthdr_uart);
226 init_uart(uart_data, USART1, 115200);
227 }
else if(dev == &uart6_device) {
229 uart_rx_eventqueue_name[1], 0, 0, 0);
231 uart_tx_eventqueue_name[1],
232 uart_data->tbuf,
sizeof(
unsigned char), 2);
233 register_interrupt(IRQ2VECT(USART6_IRQn), inthdr_uart);
237 init_uart(uart_data, USART6, 115200);
250 static int uart_getc(
struct st_device *dev,
unsigned char *rd)
259 #define UART_TC_TIMEOUT 100000 260 #define UART_TE_TIMEOUT 1000 263 static int uart_putc(
struct st_device *dev,
unsigned char td)
265 int timeout = UART_TC_TIMEOUT;
266 USART_TypeDef *uart = ((
struct st_uart_data *)(dev->
private_data))->huart.Instance;
268 while(!(uart->ISR & USART_ISR_TC)) {
271 SYSERR_PRINT(
"UART TC timeout\n");
278 uart->CR1 |= USART_CR1_TXEIE;
281 if(UART_TE_TIMEOUT != 0) {
282 SYSERR_PRINT(
"UART TXE timeout\n");
290 static int uart_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
297 UART_HandleTypeDef *huart = &(uart_data->huart);
298 init_uart(uart_data, huart->Instance, arg);
303 SYSERR_PRINT(
"Unknown ioctl(%08lX)\n", com);
311 static int uart_select(
struct st_device *dev,
unsigned int timeout)
326 static UART_HandleTypeDef huart_low;
331 static int uart_init_low(
struct st_device *dev,
char *param)
336 huart_low.Instance = USART1;
337 huart_low.Init.BaudRate = 115200;
338 huart_low.Init.WordLength = UART_WORDLENGTH_8B;
339 huart_low.Init.StopBits = UART_STOPBITS_1;
340 huart_low.Init.Parity = UART_PARITY_NONE;
341 huart_low.Init.Mode = UART_MODE_TX_RX;
342 huart_low.Init.HwFlowCtl = UART_HWCONTROL_NONE;
343 huart_low.Init.OverSampling = UART_OVERSAMPLING_16;
344 HAL_UART_Init(&huart_low);
354 static int uart_getc_low(
struct st_device *dev,
unsigned char *rd)
356 USART_TypeDef *uart = huart_low.Instance;
358 if(uart->ISR & USART_ISR_RXNE) {
359 uart->ISR &= ~(USART_ISR_RXNE);
371 static int uart_putc_low(
struct st_device *dev,
unsigned char td)
373 int timeout = UART_TC_TIMEOUT;
374 USART_TypeDef *uart = huart_low.Instance;
376 while(!(uart->ISR & USART_ISR_TC)) {
385 while(!(uart->ISR & USART_ISR_TC)) {
397 .explan =
"STM32F7 UART1",
398 .private_data = (
void *)&uart_data[0],
399 .register_dev = uart_init,
403 .select = uart_select
408 .explan =
"STM32F7 UART6",
409 .private_data = (
void *)&uart_data[1],
410 .register_dev = uart_init,
414 .select = uart_select
417 const struct st_device uart1_low_device = {
419 .explan =
"Debug/Error Console",
420 .private_data = (
void *)&uart_data[2],
421 .register_dev = uart_init_low,
422 .getc = uart_getc_low,
423 .putc = uart_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)
タスクをイベント待ち状態にする