February 2009 Rev 4 1/303
UM0233
User manual
STR91xFA firmware library
Introduction
About this manual
This document is the STR91xFA firmware library user manual. It describes the STR91xFA
peripheral firmware library: a collection of routines, data structures and macros that cover
the features of each peripheral.
This manual is structured as follows: some definitions, document conventions and firmware
library rules are provided in Section 1. Section 2 provides a detailed description of the
Firmware library: The package content, the installation steps, the library structure and an
example on how to use the library. Finally, Sections 3 to 20 describe the firmware library,
peripheral configuration structure and functions description for each peripheral in detail.
About STR91xFA library
The STR91xFA Firmware library is a firmware package consisting of device drivers for all
standard STR91xFA peripherals. You can use any STR91xFA device in applications without
in-depth study of each peripheral specification. As a result, using this library can save you a
lot of the time that you would otherwise spend in coding and also the cost of developing and
integrating your application.
Each device driver consists of a set of functions covering the functionality of the peripheral.
Since all the STR91xFA peripherals and their corresponding registers are memory-mapped,
a peripheral can be easily controlled using ‘C’ code. The source code, developed in ‘C’, is
fully documented. A basic knowledge of ‘C’ programming is required.
The library contains a complete firmware in ‘C’ that can be easily ported to any ARM
compatible ‘C’ compiler.
www.st.com
Contents UM0233
2/303
Contents
1 Document and library rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.1 Abbreviations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2 Coding rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2 Firmware library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.1 Package description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.3 Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4 Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.5 File description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.6 How to use the library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3 Peripheral firmware overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4 Flash memory interface (FMI) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.1 FMI register structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.1.1 FMI register structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.2 Firmware library functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.2.1 FMI_BankRemapConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.2.2 FMI_Config . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.2.3 FMI_EraseSector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.2.4 FMI_EraseBank . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.2.5 FMI_WriteHalfWord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.2.6 FMI_WriteOTPHalfWord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2.7 FMI_ReadWord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.2.8 FMI_ReadOTPData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.2.9 FMI_GetFlagStatus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2.10 FMI_GetReadWaitStateValue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.11 FMI_GetWriteWaitStateValue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.12 FMI_SuspendEnable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2.13 FMI_ResumeEnable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2.14 FMI_ClearFlag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.2.15 FMI_WriteProtectionCmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
UM0233 Contents
3/303
4.2.16 FMI_WaitForLastOperation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.2.17 FMI_ReadRSIGData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5 External memory interface (EMI) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.1 EMI register structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.1.1 EMI register structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.2 Firmware library functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.1 EMI_DeInit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.2 EMI_Init . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.3 EMI_StructInit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.2.4 EMI_BCLKCmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6 System control unit (SCU) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.1 Register structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.1.1 SCU register structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.2 Firmware library functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.2.1 SCU_MCLKSourceConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.2.2 SCU_PLLFactorsConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6.2.3 SCU_PLLCmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6.2.4 SCU_RCLKDivisorConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.2.5 SCU_HCLKDivisorConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.2.6 SCU_PCLKDivisorConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.2.7 SCU_FMICLKDivisorConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.2.8 SCU_EMIBCLKDivisorConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.2.9 SCU_BRCLKDivisorConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.2.10 SCU_TIMExtCLKCmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.2.11 SCU_USBCLKConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.2.12 SCU_PHYCLKConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.2.13 SCU_APBPeriphClockConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.2.14 SCU_AHBPeriphClockConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.2.15 SCU_APBPeriphDebugConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.2.16 SCU_AHBPeriphDebugConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.2.17 SCU_APBPeriphIdleConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.2.18 SCU_AHBPeriphIdleConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.2.19 SCU_APBPeriphReset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
6.2.20 SCU_AHBPeriphReset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
6.2.21 SCU_EMIModeConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Contents UM0233
4/303
6.2.22 SCU_EMIALEConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.2.23 SCU_GetPLLFreqValue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.2.24 SCU_GetMCLKFreqValue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.2.25 SCU_GetHCLKFreqValue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.2.26 SCU_GetPCLKFreqValue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.2.27 SCU_GetRCLKFreqValue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.2.28 SCU_WakeUpLineConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.2.29 SCU_EnterIdleMode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.2.30 SCU_EnterSleepMode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.2.31 SCU_UARTIrDASelect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.2.32 SCU_PFQBCCmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.2.33 SCU_ITConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.2.34 SCU_GetFlagStatus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
6.2.35 SCU_ClearFlag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
6.2.36 SCU_EMIByte_Select_Pinconfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
6.2.37 SCU_EMIclock_Pinconfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
7 General purpose I/O ports (GPIO) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
7.1 GPIO register structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
7.2 Firmware library functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
7.2.1 GPIO_DeInit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
7.2.2 GPIO_Init . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
7.2.3 GPIO_StructInit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
7.2.4 GPIO_ReadBit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
7.2.5 GPIO_Read . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
7.2.6 GPIO_WriteBit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
7.2.7 GPIO_Write . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
7.2.8 GPIO_ANAPinConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
7.2.9 GPIO_EMIConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
8 Vectored interrupt controller (VIC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
8.1 VIC register structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
8.2 Firmware library functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
8.2.1 VIC_DeInit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
8.2.2 VIC_GetIRQStatus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
8.2.3 VIC_GetFIQStatus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8.2.4 VIC_GetSourceITStatus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
UM0233 Contents
5/303
8.2.5 VIC_ITCmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.2.6 VIC_SWITCmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
8.2.7 VIC_ProtectionCmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
8.2.8 VIC_GetCurrentISRAdd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
8.2.9 VIC_GetISRVectAdd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
8.2.10 VIC_Config . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
9 Wake-up interrupt unit (WIU) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
9.1 WIU register structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
9.2 Firmware library functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
9.2.1 WIU_Init . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
9.2.2 WIU_DeInit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
9.2.3 WIU_StructInit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
9.2.4 WIU_Cmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
9.2.5 WIU_GenerateSWInterrupt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
9.2.6 WIU_GetFlagStatus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
9.2.7 WIU_ClearFlag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
9.2.8 WIU_GetITStatus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
9.2.9 WIU_ClearITPendingBit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
10 Real time clock (RTC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
10.1 RTC register structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
10.2 Firmware library functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
10.2.1 RTC_DeInit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
10.2.2 RTC_SetDate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
10.2.3 RTC_SetTime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
10.2.4 RTC_SetAlarm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
10.2.5 RTC_GetDate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
10.2.6 RTC_GetTime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
10.2.7 RTC_GetAlarm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
10.2.8 RTC_TamperConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
10.2.9 RTC_TamperCmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
10.2.10 RTC_AlarmCmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
10.2.11 RTC_CalibClockCmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
10.2.12 RTC_SRAMBattPowerCmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
10.2.13 RTC_PeriodicIntConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
10.2.14 RTC_ITConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109