Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2 | Rev 5 | ||
|---|---|---|---|
| Line 1... | Line 1... | ||
| 1 | /** |
1 | /** |
| 2 | ****************************************************************************** |
2 | ****************************************************************************** |
| 3 | * @file stm32f1xx_hal_irda.c |
3 | * @file stm32f1xx_hal_irda.c |
| 4 | * @author MCD Application Team |
4 | * @author MCD Application Team |
| 5 | * @version V1.0.1 |
5 | * @version V1.0.4 |
| 6 | * @date 31-July-2015 |
6 | * @date 29-April-2016 |
| 7 | * @brief IRDA HAL module driver. |
7 | * @brief IRDA HAL module driver. |
| 8 | * This file provides firmware functions to manage the following |
8 | * This file provides firmware functions to manage the following |
| 9 | * functionalities of the IrDA SIR ENDEC block (IrDA): |
9 | * functionalities of the IrDA SIR ENDEC block (IrDA): |
| 10 | * + Initialization and de-initialization functions |
10 | * + Initialization and de-initialization functions |
| 11 | * + IO operation functions |
11 | * + IO operation functions |
| Line 101... | Line 101... | ||
| 101 | 101 | ||
| 102 | @endverbatim |
102 | @endverbatim |
| 103 | ****************************************************************************** |
103 | ****************************************************************************** |
| 104 | * @attention |
104 | * @attention |
| 105 | * |
105 | * |
| 106 | * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> |
106 | * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> |
| 107 | * |
107 | * |
| 108 | * Redistribution and use in source and binary forms, with or without modification, |
108 | * Redistribution and use in source and binary forms, with or without modification, |
| 109 | * are permitted provided that the following conditions are met: |
109 | * are permitted provided that the following conditions are met: |
| 110 | * 1. Redistributions of source code must retain the above copyright notice, |
110 | * 1. Redistributions of source code must retain the above copyright notice, |
| 111 | * this list of conditions and the following disclaimer. |
111 | * this list of conditions and the following disclaimer. |
| Line 197... | Line 197... | ||
| 197 | This subsection provides a set of functions allowing to initialize the USARTx or the UARTy |
197 | This subsection provides a set of functions allowing to initialize the USARTx or the UARTy |
| 198 | in IrDA mode. |
198 | in IrDA mode. |
| 199 | (+) For the asynchronous mode only these parameters can be configured: |
199 | (+) For the asynchronous mode only these parameters can be configured: |
| 200 | (++) Baud Rate |
200 | (++) Baud Rate |
| 201 | (++) Word Length |
201 | (++) Word Length |
| 202 | (++) Parity: If the parity is enabled, then the MSB bit of the data written |
202 | (++) Parity |
| 203 | in the data register is transmitted but is changed by the parity bit. |
- | |
| 204 | Depending on the frame length defined by the M bit (8-bits or 9-bits), |
- | |
| 205 | the possible IRDA frame formats are as listed in the following table: |
- | |
| 206 | (+++) +-------------------------------------------------------------+ |
- | |
| 207 | (+++) | M bit | PCE bit | IRDA frame | |
- | |
| 208 | (+++) |---------------------|---------------------------------------| |
- | |
| 209 | (+++) | 0 | 0 | | SB | 8 bit data | STB | | |
- | |
| 210 | (+++) |---------|-----------|---------------------------------------| |
- | |
| 211 | (+++) | 0 | 1 | | SB | 7 bit data | PB | STB | | |
- | |
| 212 | (+++) |---------|-----------|---------------------------------------| |
- | |
| 213 | (+++) | 1 | 0 | | SB | 9 bit data | STB | | |
- | |
| 214 | (+++) |---------|-----------|---------------------------------------| |
- | |
| 215 | (+++) | 1 | 1 | | SB | 8 bit data | PB | STB | | |
- | |
| 216 | (+++) +-------------------------------------------------------------+ |
- | |
| 217 | (++) Prescaler: A pulse of width less than two and greater than one PSC period(s) may or may |
203 | (++) Prescaler: A pulse of width less than two and greater than one PSC period(s) may or may |
| 218 | not be rejected. The receiver set up time should be managed by software. The IrDA physical layer |
204 | not be rejected. The receiver set up time should be managed by software. The IrDA physical layer |
| 219 | specification specifies a minimum of 10 ms delay between transmission and |
205 | specification specifies a minimum of 10 ms delay between transmission and |
| 220 | reception (IrDA is a half duplex protocol). |
206 | reception (IrDA is a half duplex protocol). |
| 221 | (++) Mode: Receiver/transmitter modes |
207 | (++) Mode: Receiver/transmitter modes |
| Line 227... | Line 213... | ||
| 227 | 213 | ||
| 228 | @endverbatim |
214 | @endverbatim |
| 229 | * @{ |
215 | * @{ |
| 230 | */ |
216 | */ |
| 231 | 217 | ||
| - | 218 | ||
| - | 219 | /* |
|
| - | 220 | Additionnal remark: If the parity is enabled, then the MSB bit of the data written |
|
| - | 221 | in the data register is transmitted but is changed by the parity bit. |
|
| - | 222 | Depending on the frame length defined by the M bit (8-bits or 9-bits), |
|
| - | 223 | the possible IRDA frame formats are as listed in the following table: |
|
| - | 224 | +-------------------------------------------------------------+ |
|
| - | 225 | | M bit | PCE bit | IRDA frame | |
|
| - | 226 | |---------------------|---------------------------------------| |
|
| - | 227 | | 0 | 0 | | SB | 8 bit data | STB | | |
|
| - | 228 | |---------|-----------|---------------------------------------| |
|
| - | 229 | | 0 | 1 | | SB | 7 bit data | PB | STB | | |
|
| - | 230 | |---------|-----------|---------------------------------------| |
|
| - | 231 | | 1 | 0 | | SB | 9 bit data | STB | | |
|
| - | 232 | |---------|-----------|---------------------------------------| |
|
| - | 233 | | 1 | 1 | | SB | 8 bit data | PB | STB | | |
|
| - | 234 | +-------------------------------------------------------------+ |
|
| - | 235 | */ |
|
| - | 236 | ||
| 232 | /** |
237 | /** |
| 233 | * @brief Initializes the IRDA mode according to the specified |
238 | * @brief Initializes the IRDA mode according to the specified |
| 234 | * parameters in the IRDA_InitTypeDef and create the associated handle. |
239 | * parameters in the IRDA_InitTypeDef and create the associated handle. |
| 235 | * @param hirda: Pointer to a IRDA_HandleTypeDef structure that contains |
240 | * @param hirda: Pointer to a IRDA_HandleTypeDef structure that contains |
| 236 | * the configuration information for the specified IRDA module. |
241 | * the configuration information for the specified IRDA module. |
| Line 331... | Line 336... | ||
| 331 | * the configuration information for the specified IRDA module. |
336 | * the configuration information for the specified IRDA module. |
| 332 | * @retval None |
337 | * @retval None |
| 333 | */ |
338 | */ |
| 334 | __weak void HAL_IRDA_MspInit(IRDA_HandleTypeDef *hirda) |
339 | __weak void HAL_IRDA_MspInit(IRDA_HandleTypeDef *hirda) |
| 335 | { |
340 | { |
| - | 341 | /* Prevent unused argument(s) compilation warning */ |
|
| - | 342 | UNUSED(hirda); |
|
| 336 | /* NOTE: This function should not be modified, when the callback is needed, |
343 | /* NOTE: This function should not be modified, when the callback is needed, |
| 337 | the HAL_IRDA_MspInit can be implemented in the user file |
344 | the HAL_IRDA_MspInit can be implemented in the user file |
| 338 | */ |
345 | */ |
| 339 | } |
346 | } |
| 340 | 347 | ||
| Line 344... | Line 351... | ||
| 344 | * the configuration information for the specified IRDA module. |
351 | * the configuration information for the specified IRDA module. |
| 345 | * @retval None |
352 | * @retval None |
| 346 | */ |
353 | */ |
| 347 | __weak void HAL_IRDA_MspDeInit(IRDA_HandleTypeDef *hirda) |
354 | __weak void HAL_IRDA_MspDeInit(IRDA_HandleTypeDef *hirda) |
| 348 | { |
355 | { |
| - | 356 | /* Prevent unused argument(s) compilation warning */ |
|
| - | 357 | UNUSED(hirda); |
|
| 349 | /* NOTE: This function should not be modified, when the callback is needed, |
358 | /* NOTE: This function should not be modified, when the callback is needed, |
| 350 | the HAL_IRDA_MspDeInit can be implemented in the user file |
359 | the HAL_IRDA_MspDeInit can be implemented in the user file |
| 351 | */ |
360 | */ |
| 352 | } |
361 | } |
| 353 | 362 | ||
| Line 636... | Line 645... | ||
| 636 | } |
645 | } |
| 637 | 646 | ||
| 638 | /* Process Unlocked */ |
647 | /* Process Unlocked */ |
| 639 | __HAL_UNLOCK(hirda); |
648 | __HAL_UNLOCK(hirda); |
| 640 | 649 | ||
| 641 | /* Enable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */ |
- | |
| 642 | __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_ERR); |
- | |
| 643 | - | ||
| 644 | /* Enable the IRDA Transmit Data Register Empty Interrupt */ |
650 | /* Enable the IRDA Transmit Data Register Empty Interrupt */ |
| 645 | __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_TXE); |
651 | __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_TXE); |
| 646 | 652 | ||
| 647 | return HAL_OK; |
653 | return HAL_OK; |
| 648 | } |
654 | } |
| Line 974... | Line 980... | ||
| 974 | tmp_flag = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_PE); |
980 | tmp_flag = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_PE); |
| 975 | tmp_it_source = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_PE); |
981 | tmp_it_source = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_PE); |
| 976 | /* IRDA parity error interrupt occurred -----------------------------------*/ |
982 | /* IRDA parity error interrupt occurred -----------------------------------*/ |
| 977 | if((tmp_flag != RESET) && (tmp_it_source != RESET)) |
983 | if((tmp_flag != RESET) && (tmp_it_source != RESET)) |
| 978 | { |
984 | { |
| 979 | __HAL_IRDA_CLEAR_PEFLAG(hirda); |
- | |
| 980 | hirda->ErrorCode |= HAL_IRDA_ERROR_PE; |
985 | hirda->ErrorCode |= HAL_IRDA_ERROR_PE; |
| 981 | } |
986 | } |
| 982 | 987 | ||
| 983 | tmp_flag = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_FE); |
988 | tmp_flag = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_FE); |
| 984 | tmp_it_source = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_ERR); |
989 | tmp_it_source = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_ERR); |
| 985 | /* IRDA frame error interrupt occurred ------------------------------------*/ |
990 | /* IRDA frame error interrupt occurred ------------------------------------*/ |
| 986 | if((tmp_flag != RESET) && (tmp_it_source != RESET)) |
991 | if((tmp_flag != RESET) && (tmp_it_source != RESET)) |
| 987 | { |
992 | { |
| 988 | __HAL_IRDA_CLEAR_FEFLAG(hirda); |
- | |
| 989 | hirda->ErrorCode |= HAL_IRDA_ERROR_FE; |
993 | hirda->ErrorCode |= HAL_IRDA_ERROR_FE; |
| 990 | } |
994 | } |
| 991 | 995 | ||
| 992 | tmp_flag = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_NE); |
996 | tmp_flag = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_NE); |
| 993 | /* IRDA noise error interrupt occurred ------------------------------------*/ |
997 | /* IRDA noise error interrupt occurred ------------------------------------*/ |
| 994 | if((tmp_flag != RESET) && (tmp_it_source != RESET)) |
998 | if((tmp_flag != RESET) && (tmp_it_source != RESET)) |
| 995 | { |
999 | { |
| 996 | __HAL_IRDA_CLEAR_NEFLAG(hirda); |
- | |
| 997 | hirda->ErrorCode |= HAL_IRDA_ERROR_NE; |
1000 | hirda->ErrorCode |= HAL_IRDA_ERROR_NE; |
| 998 | } |
1001 | } |
| 999 | 1002 | ||
| 1000 | tmp_flag = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_ORE); |
1003 | tmp_flag = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_ORE); |
| 1001 | /* IRDA Over-Run interrupt occurred ---------------------------------------*/ |
1004 | /* IRDA Over-Run interrupt occurred ---------------------------------------*/ |
| 1002 | if((tmp_flag != RESET) && (tmp_it_source != RESET)) |
1005 | if((tmp_flag != RESET) && (tmp_it_source != RESET)) |
| 1003 | { |
1006 | { |
| 1004 | __HAL_IRDA_CLEAR_OREFLAG(hirda); |
- | |
| 1005 | hirda->ErrorCode |= HAL_IRDA_ERROR_ORE; |
1007 | hirda->ErrorCode |= HAL_IRDA_ERROR_ORE; |
| 1006 | } |
1008 | } |
| 1007 | 1009 | ||
| 1008 | /* Call the Error call Back in case of Errors */ |
1010 | /* Call the Error call Back in case of Errors */ |
| 1009 | if(hirda->ErrorCode != HAL_IRDA_ERROR_NONE) |
1011 | if(hirda->ErrorCode != HAL_IRDA_ERROR_NONE) |
| Line 1011... | Line 1013... | ||
| 1011 | /* Disable PE and ERR interrupt */ |
1013 | /* Disable PE and ERR interrupt */ |
| 1012 | __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR); |
1014 | __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR); |
| 1013 | __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE); |
1015 | __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE); |
| 1014 | __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TXE); |
1016 | __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TXE); |
| 1015 | 1017 | ||
| - | 1018 | /* Clear all the error flag at once */ |
|
| - | 1019 | __HAL_IRDA_CLEAR_PEFLAG(hirda); |
|
| - | 1020 | ||
| 1016 | /* Set the IRDA state ready to be able to start again the process */ |
1021 | /* Set the IRDA state ready to be able to start again the process */ |
| 1017 | hirda->State = HAL_IRDA_STATE_READY; |
1022 | hirda->State = HAL_IRDA_STATE_READY; |
| 1018 | HAL_IRDA_ErrorCallback(hirda); |
1023 | HAL_IRDA_ErrorCallback(hirda); |
| 1019 | } |
1024 | } |
| 1020 | 1025 | ||
| Line 1050... | Line 1055... | ||
| 1050 | * the configuration information for the specified IRDA module. |
1055 | * the configuration information for the specified IRDA module. |
| 1051 | * @retval None |
1056 | * @retval None |
| 1052 | */ |
1057 | */ |
| 1053 | __weak void HAL_IRDA_TxCpltCallback(IRDA_HandleTypeDef *hirda) |
1058 | __weak void HAL_IRDA_TxCpltCallback(IRDA_HandleTypeDef *hirda) |
| 1054 | { |
1059 | { |
| - | 1060 | /* Prevent unused argument(s) compilation warning */ |
|
| - | 1061 | UNUSED(hirda); |
|
| 1055 | /* NOTE: This function should not be modified, when the callback is needed, |
1062 | /* NOTE: This function should not be modified, when the callback is needed, |
| 1056 | the HAL_IRDA_TxCpltCallback can be implemented in the user file |
1063 | the HAL_IRDA_TxCpltCallback can be implemented in the user file |
| 1057 | */ |
1064 | */ |
| 1058 | } |
1065 | } |
| 1059 | 1066 | ||
| Line 1063... | Line 1070... | ||
| 1063 | * the configuration information for the specified USART module. |
1070 | * the configuration information for the specified USART module. |
| 1064 | * @retval None |
1071 | * @retval None |
| 1065 | */ |
1072 | */ |
| 1066 | __weak void HAL_IRDA_TxHalfCpltCallback(IRDA_HandleTypeDef *hirda) |
1073 | __weak void HAL_IRDA_TxHalfCpltCallback(IRDA_HandleTypeDef *hirda) |
| 1067 | { |
1074 | { |
| - | 1075 | /* Prevent unused argument(s) compilation warning */ |
|
| - | 1076 | UNUSED(hirda); |
|
| 1068 | /* NOTE: This function should not be modified, when the callback is needed, |
1077 | /* NOTE: This function should not be modified, when the callback is needed, |
| 1069 | the HAL_IRDA_TxHalfCpltCallback can be implemented in the user file |
1078 | the HAL_IRDA_TxHalfCpltCallback can be implemented in the user file |
| 1070 | */ |
1079 | */ |
| 1071 | } |
1080 | } |
| 1072 | 1081 | ||
| Line 1076... | Line 1085... | ||
| 1076 | * the configuration information for the specified IRDA module. |
1085 | * the configuration information for the specified IRDA module. |
| 1077 | * @retval None |
1086 | * @retval None |
| 1078 | */ |
1087 | */ |
| 1079 | __weak void HAL_IRDA_RxCpltCallback(IRDA_HandleTypeDef *hirda) |
1088 | __weak void HAL_IRDA_RxCpltCallback(IRDA_HandleTypeDef *hirda) |
| 1080 | { |
1089 | { |
| - | 1090 | /* Prevent unused argument(s) compilation warning */ |
|
| - | 1091 | UNUSED(hirda); |
|
| 1081 | /* NOTE: This function should not be modified, when the callback is needed, |
1092 | /* NOTE: This function should not be modified, when the callback is needed, |
| 1082 | the HAL_IRDA_RxCpltCallback can be implemented in the user file |
1093 | the HAL_IRDA_RxCpltCallback can be implemented in the user file |
| 1083 | */ |
1094 | */ |
| 1084 | } |
1095 | } |
| 1085 | 1096 | ||
| Line 1089... | Line 1100... | ||
| 1089 | * the configuration information for the specified IRDA module. |
1100 | * the configuration information for the specified IRDA module. |
| 1090 | * @retval None |
1101 | * @retval None |
| 1091 | */ |
1102 | */ |
| 1092 | __weak void HAL_IRDA_RxHalfCpltCallback(IRDA_HandleTypeDef *hirda) |
1103 | __weak void HAL_IRDA_RxHalfCpltCallback(IRDA_HandleTypeDef *hirda) |
| 1093 | { |
1104 | { |
| - | 1105 | /* Prevent unused argument(s) compilation warning */ |
|
| - | 1106 | UNUSED(hirda); |
|
| 1094 | /* NOTE : This function should not be modified, when the callback is needed, |
1107 | /* NOTE : This function should not be modified, when the callback is needed, |
| 1095 | the HAL_IRDA_RxHalfCpltCallback can be implemented in the user file |
1108 | the HAL_IRDA_RxHalfCpltCallback can be implemented in the user file |
| 1096 | */ |
1109 | */ |
| 1097 | } |
1110 | } |
| 1098 | 1111 | ||
| Line 1102... | Line 1115... | ||
| 1102 | * the configuration information for the specified IRDA module. |
1115 | * the configuration information for the specified IRDA module. |
| 1103 | * @retval None |
1116 | * @retval None |
| 1104 | */ |
1117 | */ |
| 1105 | __weak void HAL_IRDA_ErrorCallback(IRDA_HandleTypeDef *hirda) |
1118 | __weak void HAL_IRDA_ErrorCallback(IRDA_HandleTypeDef *hirda) |
| 1106 | { |
1119 | { |
| - | 1120 | /* Prevent unused argument(s) compilation warning */ |
|
| - | 1121 | UNUSED(hirda); |
|
| 1107 | /* NOTE: This function should not be modified, when the callback is needed, |
1122 | /* NOTE: This function should not be modified, when the callback is needed, |
| 1108 | the HAL_IRDA_ErrorCallback can be implemented in the user file |
1123 | the HAL_IRDA_ErrorCallback can be implemented in the user file |
| 1109 | */ |
1124 | */ |
| 1110 | } |
1125 | } |
| 1111 | 1126 | ||
| Line 1460... | Line 1475... | ||
| 1460 | } |
1475 | } |
| 1461 | } |
1476 | } |
| 1462 | 1477 | ||
| 1463 | if(--hirda->RxXferCount == 0) |
1478 | if(--hirda->RxXferCount == 0) |
| 1464 | { |
1479 | { |
| 1465 | - | ||
| 1466 | __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_RXNE); |
1480 | __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_RXNE); |
| 1467 | 1481 | ||
| 1468 | if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) |
1482 | if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) |
| 1469 | { |
1483 | { |
| 1470 | hirda->State = HAL_IRDA_STATE_BUSY_TX; |
1484 | hirda->State = HAL_IRDA_STATE_BUSY_TX; |
| 1471 | } |
1485 | } |
| 1472 | else |
1486 | else |
| 1473 | { |
1487 | { |
| - | 1488 | /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */ |
|
| - | 1489 | __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR); |
|
| - | 1490 | ||
| 1474 | /* Disable the IRDA Parity Error Interrupt */ |
1491 | /* Disable the IRDA Parity Error Interrupt */ |
| 1475 | __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE); |
1492 | __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE); |
| 1476 | 1493 | ||
| 1477 | /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */ |
- | |
| 1478 | __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR); |
- | |
| 1479 | 1494 | ||
| 1480 | hirda->State = HAL_IRDA_STATE_READY; |
1495 | hirda->State = HAL_IRDA_STATE_READY; |
| 1481 | } |
1496 | } |
| 1482 | HAL_IRDA_RxCpltCallback(hirda); |
1497 | HAL_IRDA_RxCpltCallback(hirda); |
| 1483 | 1498 | ||